基本理论
什么是对象
万物皆对象
对象是具体的事物
- 拥有属性、行为
- 把许多零散的东西,封装成为一个整体
Python中一切东西都是对象,Python是一门特别彻底的面向对象编程语言(OOP)
其他编程语言很多还分基本类型和对象类型,而在python中,只有对象类型
面向过程 & 面向对象
两者都是解决问题的思路、思想,面向对象本身是面向过程的封装
- 面向过程:在解决问题的时候,关注的是解决问题的每一个过程(步骤)
- 按照步骤划分
- 摆一个任务,分解成具体的每一个步骤
- 面向对象:在解决问题的时候,关注的是解决问题所需要的对象
- 按照功能对象进行划分
- 找到对象,确定对象属性和行为
- 如何从面向过程到面向对象:
- 列举任务步骤
- 分离步骤中的对象和功能代码块
- 将功能代码划分到具体对象中
- 根据对象以及具体的行为,抽取出类
类
什么是类
类是某一类具体对象特征的抽象
类的作用
根据抽象的类,生产具体的对象
类的组成
名称、属性、方法
注意:
- 属性和方法,都是抽象的概念
- 在产生对象之后,对象才拥有具体的属性值,和方法实现
对象和类的关系
对象 -- 抽象 -- 类
类 -- 实例化 -- 对象
定义类
经典类的定义:
class 类名: ......
创建一个对象
obj = 类名()
创建对象时的底层运作:
- 首先会在内存中开辟一段空间(类的定义也会占用内存)
- 通过类变量获取类名:
xxx.__name__
- 通过对象获取类:
xxx.__class__
属性相关
属性和变量的区别
概念:
- 变量是:可以改变的值
- 属性是:属于某个对象的特征
访问权限:
- 变量:根据作用域不同,存在不同的访问权限
- 属性:只能通过对象来进行访问
- 对象也是通过变量来引用,也同样有作用域权限
判断依据:
- 宿主是否存在
添加属性
- 直接通过对象,动态添加
- 语法:
对象.属性 = 值
- 语法:
- 通过类的初始化方法(构造方法)
__init__()
增加了一个属性之后,内存中先开辟一段空间存储属性值,然后在对象的空间里存储这个值对象的引用变量
访问属性
直接通过对象.属性
访问
python提供了一个 __dict__
属性,是一个字典,里面包含了现在这个对象里的所有属性
修改属性
修改属性值:对象.属性 = 值
删除属性
del 对象.属性
类属性
增加类属性:
类名.属性 = 值
- 在类中,直接写
属性 = 值
查看类属性:
类名.属性
- 类属性也可以通过对象来访问:
对象.类属性
- 对象属性查找机制:
- 优先到对象自身去查找属性,找到则结束
- 如果没找到,则根据
__class__
找到对象对应的类,找这个类的属性
修改类属性:
- 通过类名进行修改:
类名.属性 = 值
对象.__class__.属性 = 值
- 注意:不能直接通过对象进行修改!
对象.属性 = xxx
是对象的增加属性和修改属性的语法
查看所有类属性:类名.__dict__
删除类属性:
del 类名.属性
- 不能通过对象删除,del只能删除对象的直系属性
类属性的内存存储问题:
- 属性都存储在一个字典中,这个字典是实际存在的,可以通过
__dict__
进行访问 类.__dict__
是一个只读属性- 总结:
- 一般情况下,属性存储在
__dict__
这个字典中,有些内置对象没有这个属性 - 一般对象可以直接修改
__dict__
属性 - 但是类对象的
__dict__
是只读的,默认无法修改,可以通过setattr的方法修改
- 一般情况下,属性存储在
类属性被各个对象共享
限制对象可以添加的属性
在类中写上:__slots__ = [......]
后续通过类创建的对象,都只能添加指定的属性
方法相关
类中方法定义概述
描述一个目标的行为动作
和函数非常类似:
- 都封装了一系列行为动作
- 都可以在被调用之后,执行一系列行为动作
- 最主要的区别就是:调用方式
方法的划分:
- 实例方法:默认第一个参数需要接收到一个实例
- 类方法:默认第一个参数需要接收到一个类
- 静态方法:第一个参数什么也不接收
注意:
- 划分依据是:方法的第一个参数
- 不管是哪一种方法,都是存储在类中的
- 不同类型方法的调用方式不同
定义方法
定义实例方法:
class A: def shili(self): pass
定义类方法:
class A: @classmethod def lei(cls): pass
定义静态方法:
class A: @taticmethod def jingtai(): pass
调用方法
a = A() a.shili() # 调用实例方法 A.lei() # 调用类方法 a.lei() # 实例也可以调用类方法 A.jingtai() # 静态方法也是通过类调用
不管是自己传递,还是解释器帮我们处理,最重要保证不同类型的方法第一个参数接收到的是它们想要的类型
实例方法
类方法
静态方法
不同类型方法中访问不同类型的属性
来源:https://www.cnblogs.com/wbyixx/p/12231568.html