MRO(方法解析顺序)决定多继承时属性的查找顺序。Python(新式类,3.x 全部)采用 C3 线性化算法,规则:子类先于父类、按声明顺序保留兄弟类的先后、单调性(子类的顺序在父类线性化中保持一致)。可通过 Class.__mro__Class.mro() 查看。

class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
D.__mro__  # D, B, C, A, object —— 菱形继承中 A 只出现一次且在最后

super() 的工作方式super() 不是"调用父类",而是"调用 MRO 中当前类的下一个类"。在 D 的实例上,B 里的 super().__init__() 实际跳到 C,再跳到 A。这就是为什么协做多继承中每个类都该用 super() 并配合 **kwargs 传递参数——形成一条贯穿整条 MRO 链的协作调用。

易错点:

  • 以为 super 指向直接父类,钻石继承下行为"反常"实则正确。
  • MRO 无法线性化时定义类即报 TypeError: Cannot create a consistent method resolution order
  • 混用 super() 与显式父类调用(A.__init__(self))会导致某些类被调用两次或跳过。

追问方向:C3 算法的计算过程、super 的两个参数形式 super(B, self) 的意义、__mro__super 在元编程中的应用。