Python的super(),到底发生了什么?

2024-05-03 04:20:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解在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}$

Tags: 对象实例selfmakemodelinitdefcar
1条回答
网友
1楼 · 发布于 2024-05-03 04:20:01

__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()时,实际执行的内容接近于:

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

相关问题 更多 >