第一章 多继承怎么继承
多继承: 子类继承多个父类。增加了复杂性
二义性:子类继承了多个父类,到底更像哪一个呢?
深度优先 和 广度优先 解决二义性。
深度优先:
广度优先:
python使用深度优先,通过MRO(method resolution order方法解析顺序)解决基类搜索顺序问题。
MRO将类的继承图转换为一个有序序列,这样所有的继承就有了先后顺序,优先继承前面的。实例的属性查找顺序,就是MRO的一个应用。
有三种算法,进行排序:-了解就行
- 2.2版本之前, 直接先左后右, 深度优先策略;
- [MyClass, D, B, A, C, A]
- 新的问题? A到底在不在C前面,有两个A要用哪个
- [MyClass, D, B, A, C, A]
- 新式类算法,经典算法的升级,深度优先,如果有重复的只保留最后一个。
- [MyClass,D,B,A,Object,C,A,Object] 有重复的,用后面的
- [MyClass,D,B,C,A,Object]
- 2.3之后,C3算法,在类被创建出来的时候,就计算出一个MRO有序列表。2.3之后,python3唯一支持的算法。
多继承不要设计的太复杂。一个原则:能简单的,不要复杂。
第二章 多继承的缺点
抽象方法
在父类的方法中 通过 raise 抛出 NotImplementedError() , 代表这是一个抽象方法,类也是一个抽象类。这种抽象方法和抽象类,表示一种未完全实现的状态,可以在继承的子类中继续完善。只是一种标记
这个raise NotImplementedError 现阶段感觉在这没啥用,可能没理解对吧。
Mixin 混合继承 - 缺什么加什么
这里的Minix其实就是结合了 继承,覆盖,mro 的一种混合应用。
先继承 Mixin类,这样Mixin的mro优先级高于其他类,Mixin的方法也就会覆盖其他类的方法。
这是一种设计模式,称为 Mixin。
Minix 本质上就是多继承实现的。
在面向对象的设计中,一个复杂的类,往往需要很多的功能,而这些功能来自不同的类提供,这就需要很多的类组合在一起。
从设计模式的角度来说,多组合,少继承。
练习:
https://www.hugbg.com/archives/2598.html
评论