为什么在搜索B之后,不是更深入地搜索Y或Z,而是转到搜索A?
Y是A的父级,如果应该首先搜索A,但是Y是B的父级,所以它应该首先搜索Y,为什么这不会抛出MRO错误?
有人能解释一下这个查找是如何工作的吗?
class X(object):pass
class Y(object): pass
class Z(object): pass
class A(X,Y): pass
class B(Y,Z):pass
class M(B,A,Z):pass
print M.__mro__给出
(<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <type 'object'>)

发布于 2019-04-16 00:03:51
在您的具体示例中,在搜索B之后,我们不能立即考虑Y,因为它是A的子项。我们不能立即考虑Z,因为M先从A继承,再从Z继承。
Python使用C3方法解析顺序details here。
C3解析顺序很好地解决了菱形继承问题
在下面的示例中,我们有一个非常通用的类Object,它是B和C的超类。如果Object和C都没有实现,我们只希望考虑B中的方法实现(比如__repr__之类的实现)。
Object
/ \
B C
\ /
A换句话说,A的父类的传递闭包中的每个可能的父类都被考虑在内,但这些类是根据从基类到相关类的“最新”路径排序的。
有两条通往object的路径
A -> B -> Object
A -> C -> Object“最新”路径是A -> C -> Object,因为A -> B -> Object在向左倾斜的深度优先搜索中会更早。
C3线性化满足两个关键不变量:
X继承自Y,则在Y.Z继承U之前检查X,然后按顺序检查U,然后检查V,然后检查U实际上,C3线性化保证了这两个属性都成立。
构建不能线性化的层次结构是可能的,在这种情况下,类定义时会出现异常。
运行inherit.py
class E: pass
class F: pass
class A(E, F): pass
class B(F, E): pass
class Z(A, B): pass生成以下错误。
Traceback (most recent call last):
File "inherit.py", line 5, in <module>
class Z(A, B): pass
TypeError: Cannot create a consistent method resolution
order (MRO) for bases E, Fhttps://stackoverflow.com/questions/55692832
复制相似问题