Python继承:是否有必要显式调用父构造函数和析构函数?

2024-10-03 06:29:42 发布

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

我有一些代码(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__()

我们的目标是定义多个motor类,如本例中的TurnMotor,这些类通过其特定的端口从Motor和自动__init__继承。他们还应该在破坏时调用父母__del__方法来重置马达。在

我知道在这种情况下,我必须为子类定义一个__init__方法,以便用我想要的端口初始化子类,但是如果我省略了子类中__del__的定义,那么父__del__方法是否仍会从子类中调用?
一般来说,__init__也可以这样吗?在

提前谢谢,如果这是重复的,很抱歉。在


Tags: 方法selfnumberbase定义initdef子类
2条回答

__init__和{}只是构造和销毁钩子,尽管这个语句可以讨论。在

对于程序员来说,重要的是您不需要来定义超类con/descructor。如果不这样做,Python会根据方法解析顺序(MRO)在内部查找链(即基类)中查找con/destructor。在

如果你想在派生类中使用con/destructor,如果你想创建或销毁超类的实例变量(大多数时候你想这样做,因为这就是你首先派生的原因),或者在超级类con/destructor中执行任何操作,然后必须相应地调用超级类方法。在

这并不是显式的,因为(a)Python给了您不这样做的机会,(b)pythonzen说:“显式比隐式好”。在

是的。如果不重写子类中的方法,则将调用父方法。对于magic methods类似__del__或{}的情况也是如此。在

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

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

Class B将包含{}的所有信息及其特定信息。在

相关问题 更多 >