印象中,一直以为python3中的MRO是采用的广度优先算法,现在依旧有不少文章是这样写的。其实,这样理解是错误的,从python2.3 以后,MRO的算法都是采用的C3算法。
代码:
class D:
pass
class E:
pass
class C(E):
pass
class B(D):
pass
class A(B, C):
pass
print(A.__mro__)
输出:
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>)
可以看出A的MRO是:
A->B->D->C->E->object
如果是广度优先算法的话,应该是:
A->B->C->D->E->object
参考链接:
Python MRO方法解析顺序详解