super() 返回绑定代理对象,按MRO顺序调用下一个类的__init__并自动绑定self;必须显式调用,否则父类初始化不执行;参数需匹配签名,多继承时需各层协作使用super()。

在子类构造函数中用 super() 调用父类构造函数,本质是借助 Python 的方法解析顺序(MRO)和绑定机制,把当前实例自动传给父类的 __init__。关键不是“手动绑定”,而是 super() 返回一个代理对象,它知道该调用 MRO 中下一个类的方法,并自动完成 self 的绑定。
super() 返回的是绑定代理,不是父类本身
super() 不直接返回父类,而是一个特殊代理对象。当你写 super().__init__(...),Python 会:
- 查当前类的 MRO,定位到当前类在 MRO 中的下一个类(通常是直接父类,但多继承时可能不同)
- 从那个类中获取
__init__方法 - 把这个方法与当前实例(即
self)自动绑定,等价于Parent.__init__(self, ...),但更安全、更符合继承链
必须在 __init__ 中显式调用 super().__init__()
Python 不会自动调用父类构造函数。如果你不写 super().__init__(),父类的初始化逻辑(比如设置属性、分配资源)就完全不会执行。
例如:
class Animal:def __init__(self, name):
self.name = name
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name) # ✅ 必须写,否则 self.name 不会被设
self.breed = breed
参数要匹配父类 __init__ 的签名
super().__init__(...) 传入的参数,必须满足父类 __init__ 的形参要求。常见错误是漏传、多传或类型不对。
- 如果父类需要
name,你就得传;如果父类有默认参数(如age=0),你可以不传 - 使用
*args, **kwargs可提升兼容性,尤其在多层继承或框架扩展场景中
def __init__(self, name, can_fly=True, *args, **kwargs):
super().__init__(name, *args, **kwargs) # 把多余参数交给更上层
self.can_fly = can_fly
多继承时 super() 遵循 C3 线性化顺序
多个父类时,super() 不只调父类,而是按 MRO 列表顺序调“下一个”类。所有参与继承的类都应使用 super(),才能保证每个 __init__ 恰好执行一次(协作式调用)。
例如:class C(A, B): pass,MRO 是 [C, A, B, object],那么 C.__init__ 中的 super().__init__() 会调 A.__init__,而 A.__init__ 里的 super().__init__() 会继续调 B.__init__ —— 前提是 A 和 B 都用了 super()。










