我试图理解在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)
当我们创建对象my_tesla时,我们通过调用这个类的构造函数来实例化类electricar,而这个构造函数又调用父类的构造函数。这是怎么发生的?现在我有两个猜测:
1)super()只是对父类的引用,所以我们通过实例化子类的“super().init(make,model,year)”调用父类的构造函数。因此,我们只有我们类电动车()的一个对象。在
2)super(),调用父级的构造函数,创建“Car”类的对象,然后通过“super().init(make,model,year)”调用该对象的构造函数。因此,我们有两个对象:一个类Car()的对象和electricicar类的一个对象,在我们的例子中它们是相同的。在
哪一个是正确的? 如果两者都不是,请解释在:
^{pr2}$
__init__
不是构造函数,它是一个初始值设定项。在调用__init__
时,对象已经被构造(通过__new__
)。所以你只得到一个对象,但是它被初始化了两次——例如,ElectricCar.__init__
可能决定在Car.__init__
运行之后重新初始化{调用
super()
时,将在当前实例的上下文中查找相应的基类。基本上,super().__init__(make, model, year)
可以在您的示例中重写为Car.__init__(self, make, model, year)
。在这就是为什么在早期版本的python中,调用实际上是
super(ElectricCar, self)
-它查找当前类的基类(ElectricCar
),并使用当前实例(self
),就好像它是该类的实例一样。在注意,初始化并不意味着准备对象,它意味着准备对象的状态。一个对象即使没有实现
__init__
,也是完全正常的。在澄清一下:当您调用
ElectricCar()
时,实际执行的内容接近于:这意味着调用
ElectricCar.__new__
时有一个对象。对ElectricCar.__init__
的调用将只修改/初始化该对象。它可以使用其他函数,例如Car.__init__
。在相关问题 更多 >
编程相关推荐