假设您有类似
的内容class C2: pass
class C1(object): pass
class B2: pass
class B1(C1, C2): pass
class A(B1,B2): pass
当您拥有混合层次结构时,python如何相对于继承和方法解析顺序?它是否遵循旧的遍历,新的遍历,两者的混合取决于层次结构的哪个分支在走?
答案 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)