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

时间:2016-03-31 11:30:17

标签: python inheritance 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__()

目标是在此示例中定义多个运动类,例如TurnMotor,其继承自Motor和自动__init__及其特定端口。他们还应该在破坏时调用父母__del__方法来重置电机。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:3)

__init____del__仅仅是构造和破坏钩子,虽然这个陈述可以讨论。

对程序员来说重要的是你 定义超类con / desctructor。如果你不这样做,Python根据方法解析顺序(MRO)在内部查找链中查找con /析构函数,即在基类中查找./ / p >

如果你想要派生类中的con /析构函数,如果你想创建或销毁超类的实例变量(并且大多数时候你想要这样做,那就是为什么你在第一个地方派生出来或者在超类con /析构函数中做了什么,那么你将不得不相应地调用超类方法。

这不是明确的,因为(a)Python让你有机会不这样做,(b)Python Zen说:"明确比隐含更好"。