【发布时间】:2016-11-06 07:14:26
【问题描述】:
我试图了解当我们在 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 时,我们通过调用该类的构造函数来实例化 ElectricCar 类,该构造函数又调用父类的构造函数。它是如何发生的?现在我有两个猜测:
1) super() 只是对父类的引用,所以我们通过“super().init(make, model, year)”调用父类的构造函数来实例化我们的子类班级。因此,我们的 ElectricCar() 类只有 一个对象。
2) super(),调用父类的构造函数,创建“Car”类的对象,然后我们调用这个对象的构造函数,通过“super().init(品牌、型号、年份)”。因此,我们有两个对象:一个 Car() 类的对象和一个 ElectiricCar 类的对象,但在我们的例子中它们是相同的。
哪一个是正确的? 如果两者都不是,请解释一下到底发生了什么:
super().__init__(make, model, year)
【问题讨论】:
-
没有。你仍然只有一个对象,
ElectricCar。构造函数和其他函数一样。它不会为您“创建”对象 - 在执行构造函数时,该对象已经由底层运行时创建。构造函数只是用来初始化那个新对象。所以调用 super().__init__ 只是运行一个普通的对象方法。该方法是构造函数的事实是无关紧要的。只有当它被对象生成器自动执行时,它才是一个构造函数。