MRO、C3
什么是MRO?
MRO是Method solution order(方法解释顺序),主要用于在多继承下寻找属性的顺序
补充说明,属性查找顺序,实例属性 -> 类属性 -> 父类属性
什么是深度优先,什么是广度优先?
一图胜千言
深度优先
广度优先
如果用深度优先算法作为MRO会有什么问题?
Python 2
如果用广度优先算法作为MRO会有什么问题?
Python3
使用广度优先虽然能够解决问题,让A能够获取到C重写后的get方法,但是会带来另外一个问题
C3解决了什么问题?
- 本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性时,应该根据声明顺序,优先查找A类,然后再查找B类。
- 单调性:如果在C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序。
C3算法实现原理
C3 算法原理
遍历执行merge操作的序列,如果一个序列的第一个元素,是其他序列中的第一个元素,或不在其他序列出现,则从所有执行merge操作序列中删除这个元素,合并到当前的mro中
C3 算法公式 mro(class) = [class] + merge(mro(class1), mro(class2)..., [class1,class2])
推导示例