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__吗?
预先感谢您,如果这是重复的,则对不起。
对的,这是可能的。如果您不覆盖子类中的方法,则将调用父方法。对于诸如或的魔术方法也是如此。__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混合信息及其特定信息。
__init__并且__del__仅是构造和破坏钩子,尽管此声明可以讨论。
什么是程序员重要的是,你不具备对定义的超一流CON / desctructor。如果不这样做,Python会根据方法解析顺序(MRO)在内部查找链(即基类)中查找con / destructor 。
如果您想在派生类中使用con / destructor,并且要创建或销毁超类的实例变量(大多数情况下,您都希望这样做,因为这就是您首先派生的原因)或执行无论在超类con / destructor中完成什么操作,那么您都必须相应地调用超类方法。
这样做没有明确地完成,因为(a)Python使您有机会不这样做,并且(b)Python Zen说:“显式优于隐式”。