单继承
子类需要使用父类提供的属性
多继承
一个子类有多个父类
如果调用父类.__init__构造父类的属性 导致父类的属性被构造多次 产生语义的二义性《钻石继承/菱形继承》
super关键字作用 可以解决上诉问题
MRO方法解析顺序
特点:在这个顺序所有的类都只初始化一次
作用:使用这个顺序将所有的类的__init__方法全部调用一次 解决了父类.__init__方式的问题
查看MRO
类.mro()---> 列表
类.__mro__--->返回元组
顺序特点:
子类一定在父类的前面
兄弟类和继承顺序有关系
super
super关键字的本质就是使用了 MRO顺序
super()在 Py3中可以省略参数 py2 不能省略
py3中默认所有的类都是 新式类<继承object>【没有继承就是金典类】
py2中如果没有写父类 该类是经典类 如果写了父类该类就是新式类
super关键字只能用在新式类中 经典类中不能使用super关键字
super取出当前类在mro顺序的下一个类
UML 统一建模语言
类图 对象图 /静态 活动题 协作图 /动态
property 将方法包装为属性
1.装饰器方式
使用property装饰后,可以直接使用函数名取的函数的执行结果
@property 将方法装饰一个对象实例属性· 进行获取
@属性名.setter 将方法装饰为一个对象实力属性 进行设置
@属性名.deleter 将方法装饰为一个对象实例属性 进行删除
以上三种装饰器只限于新式类中
金典类只存在property的方法
2.类属性的方式
# 包装成熟性 = property(获取,设置,删除,描述)
age = property(get_age,set_age,del_age,"111")
自动调用方法并获取返回值,参数按照顺序 获取/设置/删除/描述
魔法方法
__doc__:获取类的描述信息
__module__:显示当前类的定义 所在的模块
__class__:查看当前对象的类型(谁构造的)
A类是一个对象 类对象 type(A) == A.__class__
type是默认情况下创建所有的类的元类 元类 (创建 A类对象的 类)
__del__:对象在内存中释放时触发执行
__call__:设置对象为可调用对象
__dict__:像是对象(类)的所有属性对应的值
__str__:设置 对象转化为str类型时 输出字符串
__getitem__/__setitem__/__delitem__
分别表示索引操作:获取/设置/删除数据
with:上下文管理器(Context Manager)
__enter__():上文 返回资源数据
__exit__():下文 关闭资源
任何实现了__enter__()和__exit__()方法的对象都可以称之为上下文管理器
可以使用contextmanager的装饰器
使用yield关键字切分之前运行__enter__()方法,之后运行__exit__()
yield后的值作为函数的返回值