super()按MRO调用当前类之后的下一个类方法,确保钻石继承中初始化不重复、不遗漏;必须全链使用super()才能连通,硬编码调用会中断MRO链;支持叠加式扩展,且行为随定义位置动态变化。

在多层级继承中,super() 不是简单地“跳到直接父类”,而是按方法解析顺序(MRO)调用链中“当前类之后的下一个类”的方法。它保证协作式调用,避免重复执行、遗漏初始化,尤其在钻石继承等复杂结构中至关重要。
super 的调用依据是 MRO,不是继承关系图
Python 为每个类计算一个 MRO 元组,例如:
class A: pass
class B(A): pass
class C(A): pass
class D(B, C): pass
print(D.__mro__)
输出类似:(<class 'D'>, <class 'B'>, <class 'C'>, <class 'A'>, <class 'object'>)。
当 D 中调用 super().method(),实际查找从 B 开始——即 MRO 中 D 后面的第一个类,而不是“字面上的父类”。
多层初始化必须统一用 super() 才能连通
如果某一层用了硬编码调用(如 A.__init__(self)),整条 super 链就断了,后续类无法被触发。
- ✅ 正确写法(全部协作):每层都写
super().__init__() - ❌ 错误写法(破坏协作):子类中写
Parent.__init__(self),会绕过 MRO,跳过中间类
只有全部使用 super(),才能让 D → B → C → A → object 的初始化依次、不重复、不遗漏地执行。
super 在方法重写中实现“叠加式扩展”
子类不覆盖父逻辑,而是增强它。比如日志、权限检查、预处理等场景:
class Animal:
def speak(self):
return "sound"
class Dog(Animal):
def speak(self):
return super().speak() + " (woof)"
class LoudDog(Dog):
def speak(self):
return super().speak().upper()
调用 LoudDog().speak() 得到 "SOUND (WOOF)"——三层叠加,每层只负责自己那一部分增强。
注意:super() 是动态的,与调用位置强绑定
super() 的行为取决于它写在哪一个类里、被哪个实例调用。同一个方法,在不同类中写 super().xxx(),实际调用的目标可能完全不同。
- 在
B中写super().method()→ 调用 MRO 中B后面的类(如C或A) - 在
D中写super().method()→ 调用 MRO 中D后面的类(即B) - 即使
B.method()内部也含super(),它仍按自己的 MRO 继续向下找

















