super() 不创建新对象,仅按 MRO 委托调用父类 init 初始化已存在的同一实例;__new__ 负责创建对象,__init__ 负责初始化。

构造函数执行时,对象已经创建完成,super() 并不负责“新建”对象,而是调用父类的 __init__ 方法来初始化这个已存在的对象。
对象早已存在,__init__ 只是初始化器
Python 中真正的构造过程分两步:
-
__new__负责分配内存、创建空对象(返回实例) -
__init__接收这个刚创建的对象(即self),为其设置属性、执行初始化逻辑
所以当你在 ElectricCar.__init__ 里写 super().__init__(make, model, year),传入的 self 就是那个已经造好的 ElectricCar 实例——不是新造一个 Car 对象,更不会产生两个对象。
super() 不是“跳到父类”,而是按 MRO 查找下一个类
super() 的行为由当前类的 MRO(Method Resolution Order) 决定:
- 它不简单地指向“直接父类”,而是查找 MRO 序列中,当前类之后的第一个定义了目标方法的类
- 例如
D(B, C)的 MRO 是(D, B, C, A, object),那么super().__init__()在D.__init__中会调用B.__init__,而不是A.__init__或硬编码的Car.__init__ - 所有参与继承链的类必须统一使用
super(),才能保证每个__init__恰好执行一次
实际发生的是方法委托,不是对象复制
super() 返回一个代理对象,它把方法调用“委托”给 MRO 中的下一个类。关键点包括:
- 被调用的
__init__里的self始终是同一个对象(比如my_tesla),所有初始化操作都作用于它 - 父类
__init__设置的属性(如self.make)直接写入该实例,子类后续可读可改 - 没有中间对象生成,也没有“父类实例”和“子类实例”的区分——只有唯一一个
ElectricCar实例,它同时具备Car和ElectricCar定义的所有属性与行为
常见误解澄清
✘ super() 不是父类的引用,也不等价于 ParentClass.method(self)
✘ 它不创建新对象,也不会导致“两次实例化”
✘ 它不是语法糖,而是一个依赖 MRO 的动态委托机制
✔ 正确理解:它是让当前对象沿继承链向上完成初始化的协调工具

















