10

假设你有类似的东西

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

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

4

2 回答 2

2

答案是“两者的混合”。您可以使用 来检查自己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 的东西。

于 2013-06-11T13:47:27.317 回答
1

来自文档

C 的线性化是 C 的总和加上双亲的线性化和双亲列表的合并。

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

它必须以递归方式完成,所以我不会期待不同的行为。

于 2013-06-11T13:08:21.513 回答