Python的super(),到底发生了什么?
这个问题在这里已经有了答案:
__init__
不是构造函数,它是一个初始值设定项 。 到__init__
被调用时,对象已经被构建(通过__new__
)。 所以你只能得到一个对象,但它被初始化了两次 - 例如, ElectricCar.__init__
可能决定在Car.__init__
被运行后重新初始化self.model
。
当调用super()
,在当前实例的上下文中查找适当的基类。 基本上,在您的示例中, super().__init__(make, model, year)
可以重写为Car.__init__(self, make, model, year)
。
这就是为什么在早期版本的python中,调用实际上是super(ElectricCar, self)
- 它查找当前类的基类( ElectricCar
)并使用当前实例( self
),就好像它是该类的一个实例。
请注意,初始化并不意味着准备对象,它意味着准备对象的状态。 即使它没有实现__init__
对象也是完全有效的。
澄清:当你打电话给ElectricCar()
,实际执行的内容接近于:
that_object = ElectricCar.__new__() # this will actually use object.__new__
if isinstance(that_object, ElectricCar):
ElectricCar.__init__(that_object)
return that_object
这意味着您有一个对象来自ElectricCar.__new__
。 对ElectricCar.__init__
的调用只会修改/初始化该对象。 它可以使用其他函数,如Car.__init__
。