Ste*_*ini 10 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
Run Code Online (Sandbox Code Playgroud)
当您具有混合层次结构时,python如何相对于继承和方法解析顺序?它是否遵循旧的遍历,新的遍历,两者的混合取决于层次结构的哪个分支行走?
答案是“两者的混合”。您可以使用 来检查自己inspect.getmro(),它适用于旧式和新式类。它返回MRO,即方法解析顺序。
任何旧式类别都有一个深度优先、从第一个到最后一个基地的 MRO。(对于最复杂的情况,这不是一个好主意,但要保持向后兼容性。)我们可以这样表达它,这是有效的,因为所有父类的 MRO 都已经计算出来了:
mro(new_class) = [new_class] + mro(first_base) + mro(second_base) + ...
Run Code Online (Sandbox Code Playgroud)
对于新样式的类,该算法使用相同的基本思想,但更复杂——它也以[new_class]但随后是一些更巧妙的列表合并mro(first_base),mro(second_base)等等。
无论这些基类中的每一个是旧式的还是新式的,它们都已经有自己的先前计算的 MRO,并且这些 MRO(作为列表)是唯一用于计算新类的 MRO 的东西。
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |