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

时间:2013-06-11 11:57:25

标签: 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

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

2 个答案:

答案 0 :(得分:2)

答案是“两者兼而有之”。您可以使用inspect.getmro()来检查自己, mro(new_class) = [new_class] + mro(first_base) + mro(second_base) + ... 适用于旧式和新式类。它返回MRO,即方法解析顺序。

任何旧式的类都有一个深度优先,从头到尾的MRO。 (对于最复杂的情​​况,这是一个坏主意,但保持向后兼容性。)我们可以像这样表达它,因为已经计算了所有父类的MRO:

[new_class]

对于新式类,该算法使用相同的基本思想,但更复杂 - 它也以mro(first_base)开头,但后面是一些更聪明的列表mro(second_base)的合并, {{1}}等等。

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

答案 1 :(得分:1)

来自docs

  

C的线性化是C加上合并的总和   父母的线性化和父母的名单。

这意味着它取决于它当前正在走的层次结构的哪个分支(即它是一个混合)。

必须以递归方式完成,所以我不希望有不同的行为。