Python继承:是否需要显式调用parents构造函数和析构函数?

Python Inheritance: Is it necessary to explicitly call the parents constructor and destructor?

我有一些代码(用于 ev3dev):

class Motor(object):
    def __init__(self, portName):
        self.base = "/sys/class/tacho-motor/motor"
        self.number = self.getMotorNumberWithSpecificPortName(portName)
        self.name = self.base + str(self.number) + "/"

        self.setDefaultValues()

    def __del__(self):
        self.callReset()

    (...)

class TurnMotor(Motor):
    def __init__(self):
        super(TurnMotor, self).__init__("outA")

    def __del__(self):
        super(TurnMotor, self).__del__()

目标是定义多个电机 类,如本例中的 TurnMotor,它们继承自 Motor 和自动 __init__ 及其特定端口。他们还应该在销毁时调用 parents __del__ 方法来重置电机。

我知道在这种情况下我必须为子类定义一个 __init__ 方法以使用我想要的端口启动但是 parents __del__ 方法仍然会被调用如果我在子类中省略了 __del__ 的定义?
这通常也适用于 __init__ 吗?

提前致谢,如果这是重复的,我们深表歉意。

是的,这是可能的。如果您不覆盖子类中的方法,则将调用父方法。这也适用于 magic methods,如 __del____init__

这里是我运行在pythoncli中的一个小例子

>>> class A():
...    def __del__(self):
...       print('A.__del__')
... 
>>> class B(A): pass
... 
>>> b = B()
>>> del b
A.__del__

Class B 将包含 class A 的所有信息及其特定信息。

__init____del__只是构造和销毁钩子,虽然这个说法可以讨论。

对程序员来说重要的是你没有定义超级classcon/desctructor.如果不这样做,Python 会根据 方法解析顺序Python 在内部查找链中查找 con/destructor,即在基础 class(es) 中=24=] (MRO).

如果你想要一个con/destructor在派生class 如果你想创建或销毁超class的实例变量(大多数时候你想这样做,因为这就是你首先派生的原因)或者做任何在超级 classes con/destructor 中完成的事情,那么你将不得不调用super classes 相应的方法。

这并没有明确地完成,因为 (a) Python 给了你不这样做的机会,并且 (b) Python Zen 说:"Explicit is better than implicit".