Python中mro继承顺序查询之C3算法

1. mro遍历顺序

  1. python中存在多继承:A同时继承B和C,B继承E,C继承F,E和F最终继承object,如果我们访问A的实例对象的属性,他的查找方法遵循C3算法,(之前是深度优先查询,一条路走到底)

    深度优先算法:

    

 

 

 

2. C3算法

  1. 公式:mro(A) = [A] + merge(mro(B),mro(C),[B,C])

  2. merge的意思是合并,如果一个序列的第一个元素,是其他序列中的第一个元素,或不在其他序列出现,则从所有执行merge操作序列中删除这个元素,合并到当前的mro中。merge操作后的序列,继续执行merge操作,直到merge操作的序列为空。如果merge操作的序列无法为空,则说明不合法。

以实例代码为例:
        第一步:mro(A) = [A] + merge([B,E,O],[C,F,O],[B,C]),看merge中第一个序列的第一个元素B,不存在其他序列的第二个元素起,合并进列表
        第二步:mro(A) = [A,B] + merge(E,O],[C,F,O],[C]),看merge中第一个序列的第一个元素E,不存在其他序列的第二个元素起,合并进列表
        第三步:mro(A) = [A,B,E] + merge([O],[C,F,O],[C]),看merge中第一个序列的第一个元素O,存在其他序列的第二个元素起,跳过
        第四步:mro(A) = [A,B,E] + merge([O],[C,F,O],[C]),看merge中第二个序列的第一个元素C,不存在其他序列的第二个元素起,合并进列表
        第五步:mro(A) = [A,B,E] + merge([O],[F,O],[C]),看merge中第一个序列的第一个元素O,存在其他序列的第二个元素起,跳过
        第六步:mro(A) = [A,B,E,C] + merge([O],[F,O],[]),看merge中第二个序列的第一个元素F,不存在其他序列的第二个元素起,合并进列表
        第七步:mro(A) = [A,B,E,C,F] + merge([O],[O],[]),看merge中第一个序列的第一个元素O,不存在其他序列的第二个元素起,合并进列表
        第八步:mro(A) = [A,B,E,C,F,O],通过C3算法得到遍历顺序

  
# 代码展示
class
E: pass class F: pass class B(E): pass class C(F): pass class A(B,C): pass
# [
<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class 'object'>] print(A.mro()) print(B.mro()) # [<class '__main__.B'>, <class '__main__.E'>, <class 'object'>] print(C.mro()) # [<class '__main__.C'>, <class '__main__.F'>, <class 'object'>]

 

 

posted @ 2022-12-02 17:15  无敌小豆包  阅读(196)  评论(0)    收藏  举报