Python继承:是否必须显式调用parent构造函数和析构函数?

mon*_*mpe 5 python inheritance lego-mindstorms

我有一些代码(适用于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__()
Run Code Online (Sandbox Code Playgroud)

目标是定义多个电机类,如TurnMotor本例中所示,它们从其特定端口继承Motor并自动运行__init__。他们还应__del__在破坏时调用父方法以重置电动机。

我知道在这种情况下,我必须__init__为子类定义一个方法以使用我想要的端口启动,但是__del__如果我在子类中省略了定义,仍可以从子类中调用parent 方法__del__吗?
总的来说这也可能__init__吗?

预先感谢您,如果这是重复的,则对不起。

kek*_*coh 5

对的,这是可能的。如果您不覆盖子类中的方法,则将调用父方法。对于诸如或的魔术方法也是如此。__del____init__

这是我在python cli中运行的一个小示例

>>> class A():
...    def __del__(self):
...       print('A.__del__')
... 
>>> class B(A): pass
... 
>>> b = B()
>>> del b
A.__del__
Run Code Online (Sandbox Code Playgroud)

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


ste*_*fen 5

__init__并且__del__仅是构造和破坏钩子,尽管此声明可以讨论。

什么是程序员重要的是,你不具备定义的超一流CON / desctructor。如果不这样做,Python会根据方法解析顺序(MRO)在内部查找链(即基类)中查找con / destructor 。

如果您想在派生类中使用con / destructor,并且要创建或销毁超类的实例变量(大多数情况下,您都希望这样做,因为这就是您首先派生的原因)或执行无论在超类con / destructor中完成什么操作,那么您都必须相应地调用超类方法。

这样做没有明确地完成,因为(a)Python使您有机会不这样做,并且(b)Python Zen说:“显式优于隐式”。