9

我有一些代码(用于 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__使用其特定端口。他们还应该在销毁时调用父母__del__方法来重置电机。

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

提前感谢,如果这是重复的,对不起。

4

2 回答 2

11

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

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

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

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

于 2016-03-31T11:43:00.573 回答
9

__init__并且__del__仅仅是构造和破坏的钩子,尽管这个声明可以进行讨论。

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

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

这不是显式完成的,因为 (a) Python 让您有机会不这样做,并且 (b) Python Zen 说:“显式优于隐式”。

于 2016-03-31T11:50:28.220 回答