方法分辨顺序MR

2024-09-22 20:20:29 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么在搜索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}$

enter image description here


Tags: object错误passclassprintmropr2父项
1条回答
网友
1楼 · 发布于 2024-09-22 20:20:29

在您的具体示例中,在搜索^{{cd1>}之后,我们不能立即考虑^{{cd2>},因为它是^{{cd3>}的子对象。我们不能立即考虑^{cd4>},因为^{cd5>}在之前继承自^{cd3>}之前,它继承自^{cd4>}。


Python使用C3方法解析顺序details here

C3分辨率阶较好地解决了金刚石继承问题

在下面的示例中,我们有一个非常通用的类^{cd8>},它是^{{cd1>}和^{cd10>}的超类。我们只希望在^{cd8>}中的方法实现(例如^{cd11>}或其他方面)在^{{cd1>}和^{{cd10>}都没有实现时考虑。

         Object
         /   \
        B     C
         \   /
           A

换句话说,考虑了^{{cd3>}的父类的传递闭包中的每个可能父类,但这些类是根据从基类到所述类的“最新”路径排序的。

有两条路径^{{cd16>}:

^{pr2}$

“最新”路径是^{{cd17>}因为^{cd18>}在左偏深度优先搜索中更早。

C3线性化满足两个关键不变量:

  • 如果^{cd19>}继承自^{cd2>},^{cd19>}在^{{cd2>}之前检查^{cd19>}。
  • 如果^{cd4>}继承自^{cd24>},则在^{cd25>}之前,按该顺序^{{cd24>}进行检查。

的确^{cd28}线性化保证了这两个属性都保持不变。

可以构造不能线性化的层次结构,在这种情况下,在类定义时会出现异常。

正在运行^{cd29>}

^{pr3}$

产生以下错误。

^{pr4}$

相关问题 更多 >