新型类中的 MRO(方法解析顺序)
在 Python 中,方法解析顺序 (MRO) 决定方法的解析方式如果是继承的话。在新式类中,MRO 遵循特定规则,如 Python in a Nutshell(第二版)文档中所述。
在给定的示例中,代码使用新式类语法,但 MRO其行为就好像它是一个旧式类。新式类的预期 MRO 应该将 Base3 放在 Base1 之前,以纠正这种差异。
旧式类和新式类中 MRO 的主要区别在于,当相同祖先时,它们如何处理多重继承类出现多次。在旧式类中,深度优先方法可能会导致方法解析不正确。然而,在新式类中,书中提到的菱形继承模式被正确处理。
例如,考虑以下菱形继承层次结构:
<code class="python">class A(object): x = 'a' class B(A): pass class C(A): x = 'c' class D(B, C): pass</code>
在旧式类中,MRO 将为 D - B - A - C - A,导致 D 中 x 的值为“a”。然而,在新式类中,MRO 是 D - B - C - A - 对象,将 C 放在 A 之前,并允许覆盖 C 中的 x 生效。这解决了菱形继承问题。
因此,给定示例的正确 MRO 是 Derived - Base2 - Base1 - Base3 - object,但由于不明确的 MRO 行为,当前代码会产生不正确的结果。为了纠正这个问题,应该更新类语法以显式指定类继承自 object 以调用预期的 MRO 语义。
以上是为什么我的新型 Python 类中的 MRO 没有按预期运行?的详细内容。更多信息请关注PHP中文网其他相关文章!