假设您有类似

class C2: pass
class C1(object): pass
class B2: pass
class B1(C1, C2): pass
class A(B1,B2): pass

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

最佳答案

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

任何旧式类的MRO都是基于深度优先,从最后到最后的。 (对于大多数复杂的情况,这是一个坏主意,但保持向后兼容性。)我们可以这样表示,因为所有父类的MRO已经计算出来,所以它可以工作:

 mro(new_class) = [new_class] + mro(first_base) + mro(second_base) + ...

对于新型类,该算法使用相同的基本思想,但更为复杂---它也以[new_class]开头,但随后更巧妙地合并了mro(first_base)mro(second_base)等列表。

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

10-08 18:53