多重继承旧式类使用深度优先算法,新式类使用c3 算法,我们解释的是c3 算法。
多重继承结构如下:
该种可以MRO, 结果是E->C->D->A->B-object
class A(object):
pass
class B(object):
pass
class C(A, B):
pass
class D(A, B):
pass
class E(C, D):
pass
if __name__ == '__main__':
print E.__mro__
解析:
首先找到入度为0 的E, 清楚E的所有联系,现在符合入度为0 的有C、D,由于E的继承顺序,所以选择C,然后清除C的所有联系,当下满足入度为0 的只有D,所以切除所有D的联系,当下满足入度为0 的有A、B,再根据继承顺序选择A,然后B,最后object。所以mro的结果是E->C->D->A->B-object.
该种不可以MRO
class A(object):
pass
class B(object):
pass
class C(A, B):
pass
class D(B, A):
pass
class E(C, D):
pass
if __name__ == '__main__':
print E.__mro__
报错信息如下:
Traceback (most recent call last):
File "canot_mro.py", line 9, in <module>
class E(C, D):
TypeError: Error when calling the metaclass bases
Cannot create a consistent method resolution
order (MRO) for bases B, A
解析:
E->C->D 都正常,但是到了A、B,不知道怎么构建就出错了。所以在继承的时候需要注意继承顺序,以免造成不能构建mro 的情况。