super 按 MRO 查找继承链中“下一个类”的同名方法,依赖调用位置、参数传递及所有类统一使用;单继承中提升可维护性与扩展性,多重继承中确保 MRO 完整执行,非 init 方法中支持复用+扩展,类方法等需显式传参。

super 不是“调父类”,而是按方法解析顺序(MRO)找继承链中“下一个类”的同名方法。它的行为完全取决于调用位置、参数传递和所有参与类是否统一使用它——缺一不可。
单继承中:简化调用,提升可维护性
在只有 A ← B 这样的线性结构里,super().method() 和 B 的直接父类 A.method(self) 效果相同,但优势明显:
- 不硬编码父类名,父类改名或重构时子类代码无需修改
- 支持混入类(Mixin)动态插入,调用逻辑自动适应新 MRO
- 写法统一,为后续可能引入多重继承留出扩展空间
多重继承中:保证 MRO 链完整执行
当出现菱形继承(如 C 继承 A 和 B,A/B 都继承 Base)时,super 是唯一可靠方式:
- 所有类(A、B、C)都用 super().__init__(),Base.__init__() 只执行一次
- 若 A 写 A.__init__(self),B 写 super().__init__(),则 Base 可能被跳过或重复执行
- 可通过 C.__mro__ 查看实际顺序,super 在 A 中调的不是 Base,而是 MRO 中 A 后面那个类
非 __init__ 方法中:复用+扩展标准模式
super 不限于构造函数,任何需沿链向上委托的方法都适用:
- 重写 __str__ 时,用 super().__str__() 获取基础字符串再追加信息
- 覆盖 __eq__ 后,先 super().__eq__(other) 判断基础相等性,再补充字段比较
- 自定义描述符的 __get__ 或 __set__ 中,也可用 super().__get__(instance, owner) 委托上级逻辑
类方法与特殊上下文中:显式传参才有效
普通实例方法里用 super() 就够了;但在其他场景需明确指定类和对象:
- 类方法(@classmethod)中:super(cls, cls).classmethod_name()
- 需要在静态方法或模块级代码中触发时:super(Child, obj).method(),但要确保 obj 是 Child 实例
- 不能在 @staticmethod 里用 super(),因无 self/cls 上下文,会报 RuntimeError











