super()是最安全调用父类方法的方式,基于mro查找下一类而非直接父类;实例方法中用super().method()自动绑定self,类方法中super().cls_method()自动传入cls,静态方法中super()无意义。

在子类中重写父类方法后,若需复用父类逻辑,super() 是最安全、最推荐的方式调用被覆盖的父类方法——它自动绑定正确的类与实例,避免硬编码父类名带来的维护风险。
super() 在实例方法中的标准用法
在实例方法中,super() 返回一个代理对象,可调用父类中同名方法。关键在于:它基于 MRO(方法解析顺序) 查找下一个类,而非简单“上一级”。
- 调用父类实例方法:
super().method_name(*args, **kwargs) - 确保父类方法接收相同参数(或兼容签名),否则会报错
- 不显式传
self—— super() 已自动绑定当前实例
在类方法中使用 super() 调用父类类方法
类方法(用 @classmethod 修饰)中,super() 同样适用,但需注意:cls 参数由解释器自动传入,无需手动传递。
- 正确写法:
super().class_method_name(*args)或super(ChildClass, cls).class_method_name(*args) - 错误写法:
super().class_method_name(cls, ...)(重复传cls) - 典型场景:子类类方法扩展初始化逻辑,再委托父类完成核心注册或配置
避免常见陷阱:不是所有“父类”都等于 super() 查到的那个
super() 不指向字面意义上的直接父类,而取决于当前类的 MRO。多重继承时尤其明显:
- 执行
print(C.mro())可查看实际顺序,确认 super() 会跳到哪一环 - 若误以为 super() 总是调
Parent,但在class C(B, A):中,super()在B里可能跳向A而非object - 想绕过 MRO 强制调某特定父类?应显式写
ParentClass.method(self, ...),但这会破坏协作式设计,慎用
静态方法中 super() 通常无意义
静态方法(@staticmethod)不接收 self 或 cls,super() 无法构建有效代理。若需复用逻辑:
- 优先考虑将共用逻辑提取为普通函数,供父子类静态方法调用
- 或改用类方法 + super(),更符合面向对象语义
- 强行在
@staticmethod中写super().xxx()会触发RuntimeError(未绑定上下文)











