super()按MRO动态查找下一个有该方法的类,需各层统一使用且参数一致,否则链断裂;MRO顺序决定调用路径,多继承时依元组紧邻下一类触发。

在多层继承中,super() 不是简单地“调用直接父类”,而是按方法解析顺序(MRO)动态查找并触发链中**下一个有该方法的类**。只要所有类统一使用 super(),就能让方法调用像流水线一样逐级向上或横向传递,真正实现协作式继承。
理解 MRO 是正确触发的前提
MRO 决定了 super() 找谁——不是写死父类名,而是查 ClassName.__mro__ 元组里的下一个类:
- 执行
print(Child.__mro__)可看到实际顺序,例如(Child, Parent, GrandParent, object) -
super()在Child.greet()中调用时,会跳过Child自己,从Parent开始找greet - 如果
Parent没定义greet,它会继续找GrandParent,直到object
多层中正确触发父类方法的写法
关键在于:每层都用 super(),且参数签名保持一致(尤其 __init__):
- 子类
__init__必须接收父类需要的所有参数,并原样或通过*args, **kwargs传给super().__init__() - 避免在某一层突然改用
Parent.__init__(self, ...),否则 MRO 链断裂,后续类不会被调到 - 方法重写时,
super().method()可放在任意位置(开头、中间、结尾),控制逻辑执行时机
常见错误导致触发失败
看似调了 super(),但方法没执行?多半掉进这些坑:
- 父类根本没定义你要调的方法,
super().xxx()会一路查到object后报AttributeError - 参数不匹配:父类
def func(self, x, y),子类却只传super().func(x)→ 报missing 1 required argument - 在静态方法、类方法或模块顶层用
super()→ 直接RuntimeError,它只适用于实例方法上下文
多继承场景下的触发逻辑
当类同时继承多个父类(如 class D(B, C):),super() 触发的是 MRO 中**紧邻当前类的下一个类**,不一定是第一个父类:
-
D.__mro__可能是(D, B, C, A, object),那么super().__init__()在D中就先找B的__init__ - 若
B.__init__也用了super(),它会接着找C,而不是跳回D或绕过C - 所有父类必须参与协作——只要有一个不用
super(),整个链就可能卡住或重复

















