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'>]
标签:第一个,merge,Python,元素,序列,mro,C3,第二个 From: https://www.cnblogs.com/chf333/p/16944851.html