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