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__ 。
