super()调用的是mro中下一个类的方法,而非直接父类:它返回代理对象,在继承链中向上委托,确保多继承下初始化只执行一次,要求所有类统一使用super()以维持调用链完整。

super().方法名不是简单地“跳到父类去执行”,而是按当前实例所属类的 MRO(方法解析顺序)链条,查找并调用**下一个拥有该方法的类**中的实现。它本质是委托机制,不是硬编码的父类调用。
super 调用的是 MRO 中的“下一个类”,不是“直接父类”
Python 类的继承关系会生成一个线性化的 MRO 元组,可通过 ClassName.__mro__ 查看。super() 从当前类开始,在 MRO 中向后查找第一个定义了目标方法的类,并调用其方法。
- 单继承时,MRO 通常是
(当前类, 父类, object),所以 super() 表现像“调父类” - 多继承或 Mixin 场景下,MRO 可能跳过某些中间类。例如
class D(B, C)的 MRO 若为(D, B, C, A, object),那么super().__init__()在 D 中会调 B 的__init__,而非直接父类 B 或 C 的“上层”A - 若 B 没有定义
__init__,则继续沿 MRO 向后找 C → A,直到找到为止
所有参与类必须统一使用 super(),否则链会断裂
在钻石继承等结构中(如 A ← B、A ← C ← D),只有当 B、C、D 都用 super().__init__(),才能保证 A 的 __init__ 只执行一次。一旦某个类改用 A.__init__(self),就绕过了 MRO,破坏协作。
- B 和 C 都写
super().__init__()→ D 实例化时,A.__init__ 执行一次 - 若 B 写
A.__init__(self),C 写super().__init__()→ A.__init__ 可能被执行两次,或 C 的 super 调用失效 - 这种协作依赖“契约”:每个类都信任 super 会把控制权交给下一个合适的位置
super 返回的是代理对象,不是类或实例
super() 实际返回一个 super 类型的代理对象,它绑定了当前类和当前实例(或类)。后续对它的属性或方法访问(如 .greet()),会自动在 MRO 中查找并绑定调用。
- 这个代理不暴露具体类名,也不允许你手动指定“跳几级”,完全由 MRO 决定行为
- 它只在类方法(实例方法、类方法)中有效;在模块顶层、静态方法或普通函数里调用会报
RuntimeError - 参数需严格匹配目标方法签名——
super().foo(x, y)传参错误,报的是目标方法的TypeError,而非 super 本身
super 不限于 __init__,适用于任何可继承的方法和特殊方法
只要方法遵循相同的 MRO 协作约定,super 就能用于叠加逻辑:
-
__str__:子类添加前缀后,用super().__str__()获取基础字符串 -
__eq__:先检查基础字段相等性,再比自定义字段 -
__get__(描述符):委托给上级描述符逻辑 -
__new__:安全创建实例的标准方式,尤其在元类或不可变类型中










