MRO、C3

什么是MRO?

MRO是Method solution order(方法解释顺序),主要用于在多继承下寻找属性的顺序

补充说明,属性查找顺序,实例属性 -> 类属性 -> 父类属性

什么是深度优先,什么是广度优先?

一图胜千言

深度优先

广度优先

https://images0.cnblogs.com/blog/444975/201301/31112651-985e5983f5b448ada41bf3c735ca61e6.png

如果用深度优先算法作为MRO会有什么问题?

Python 2

如果用广度优先算法作为MRO会有什么问题?

Python3

使用广度优先虽然能够解决问题,让A能够获取到C重写后的get方法,但是会带来另外一个问题

https://i.ibb.co/ZXJgRQn/image.png

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])

推导示例

results matching ""

    No results matching ""