假设您有类似
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的东西。