为什么在搜索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__
给予
^{pr2}$
Tags:
在您的具体示例中,在搜索^{{cd1>}之后,我们不能立即考虑^{{cd2>},因为它是^{{cd3>}的子对象。我们不能立即考虑^{cd4>},因为^{cd5>}在之前继承自^{cd3>}之前,它继承自^{cd4>}。
Python使用C3方法解析顺序details here。
C3分辨率阶较好地解决了金刚石继承问题
在下面的示例中,我们有一个非常通用的类^{cd8>},它是^{{cd1>}和^{cd10>}的超类。我们只希望在^{cd8>}中的方法实现(例如^{cd11>}或其他方面)在^{{cd1>}和^{{cd10>}都没有实现时考虑。
换句话说,考虑了^{{cd3>}的父类的传递闭包中的每个可能父类,但这些类是根据从基类到所述类的“最新”路径排序的。
有两条路径^{{cd16>}:
^{pr2}$“最新”路径是^{{cd17>}因为^{cd18>}在左偏深度优先搜索中更早。
C3线性化满足两个关键不变量:
的确^{cd28}线性化保证了这两个属性都保持不变。
可以构造不能线性化的层次结构,在这种情况下,在类定义时会出现异常。
正在运行^{cd29>}
^{pr3}$产生以下错误。
^{pr4}$相关问题 更多 >
编程相关推荐