如果在层次结构中混合旧样式类和新样式类会发生什么?

Ste*_*ini 10 python multiple-inheritance method-resolution-order

假设你有类似的东西

class C2: pass
class C1(object): pass
class B2: pass
class B1(C1, C2): pass
class A(B1,B2): pass
Run Code Online (Sandbox Code Playgroud)

当您具有混合层次结构时,python如何相对于继承和方法解析顺序?它是否遵循旧的遍历,新的遍历,两者的混合取决于层次结构的哪个分支行走?

Arm*_*igo 2

答案是“两者的混合”。您可以使用 来检查自己inspect.getmro(),它适用于旧式和新式类。它返回MRO,即方法解析顺序。

任何旧式类别都有一个深度优先、从第一个到最后一个基地的 MRO。(对于最复杂的情​​况,这不是一个好主意,但要保持向后兼容性。)我们可以这样表达它,这是有效的,因为所有父类的 MRO 都已经计算出来了:

 mro(new_class) = [new_class] + mro(first_base) + mro(second_base) + ...
Run Code Online (Sandbox Code Playgroud)

对于新样式的类,该算法使用相同的基本思想,但更复杂——它也以[new_class]但随后是一些更巧妙的列表合并mro(first_base)mro(second_base)等等。

无论这些基类中的每一个是旧式的还是新式的,它们都已经有自己的先前计算的 MRO,并且这些 MRO(作为列表)是唯一用于计算新类的 MRO 的东西。