我有一些代码(对于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__
来说,这通常也是可能的吗?
提前致谢,对不起,如果这是重复的话。
答案 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说:"明确比隐含更好"。