我试图了解在Python中实例化子类时创建的对象,例如:
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
class ElectricCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2016)
Run Code Online (Sandbox Code Playgroud)
当我们创建对象my_tesla时,我们通过调用此类的构造函数来实例化类ElectricCar,该类又调用父类的构造函数.怎么会发生?现在我有两个猜测:
1)super()只是对父类的引用,因此我们通过"super().init(make,model,year)"实例化我们的子类来调用父类的构造函数.因此,我们只有一个类PowerCar()的对象.
2)super(),调用父类的构造函数,创建"Car"类的对象,然后我们通过"super().init(make,model,year)" 调用该对象的构造函数.因此,我们有两个对象:Car()类的一个对象和ElectiricCar类的一个对象,在我们的例子中它们是相同的.
哪一个是正确的?如果两者都没有,请解释一下究竟发生了什么:
super().__init__(make, model, year)
Run Code Online (Sandbox Code Playgroud)
__init__它不是构造函数,它是一个初始化程序.到__init__调用时,对象已经构建(通过__new__).因此,您只获得一个对象,但它已初始化两次 - 例如,ElectricCar.__init__可能决定在运行self.model后重新初始化Car.__init__.
调用时super(),在当前实例的上下文中查找相应的基类.基本上,super().__init__(make, model, year)可以像Car.__init__(self, make, model, year)你的例子一样重写.
这就是为什么在早期版本的python中,调用实际上是super(ElectricCar, self)- 它查找当前class(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
Run Code Online (Sandbox Code Playgroud)
这意味着您有一个来自调用的对象ElectricCar.__new__.调用ElectricCar.__init__只会修改/初始化该对象.它可以使用其他功能,例如Car.__init__.