Python继承:是否需要显式调用parents构造函数和析构函数?
Python Inheritance: Is it necessary to explicitly call the parents constructor and destructor?
我有一些代码(用于 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__
及其特定端口。他们还应该在销毁时调用 parents __del__
方法来重置电机。
我知道在这种情况下我必须为子类定义一个 __init__
方法以使用我想要的端口启动但是 parents __del__
方法仍然会被调用如果我在子类中省略了 __del__
的定义?
这通常也适用于 __init__
吗?
提前致谢,如果这是重复的,我们深表歉意。
是的,这是可能的。如果您不覆盖子类中的方法,则将调用父方法。这也适用于 magic methods,如 __del__
或 __init__
。
这里是我运行在pythoncli中的一个小例子
>>> class A():
... def __del__(self):
... print('A.__del__')
...
>>> class B(A): pass
...
>>> b = B()
>>> del b
A.__del__
Class B
将包含 class A
的所有信息及其特定信息。
__init__
和__del__
只是构造和销毁钩子,虽然这个说法可以讨论。
对程序员来说重要的是你没有有去定义超级classcon/desctructor.如果不这样做,Python 会根据 方法解析顺序Python 在内部查找链中查找 con/destructor,即在基础 class(es) 中=24=] (MRO).
如果你想要一个con/destructor在派生class 和如果你想创建或销毁超class的实例变量(大多数时候你想这样做,因为这就是你首先派生的原因)或者做任何在超级 classes con/destructor 中完成的事情,那么你将不得不调用super classes 相应的方法。
这并没有明确地完成,因为 (a) Python 给了你不这样做的机会,并且 (b) Python Zen 说:"Explicit is better than implicit".
我有一些代码(用于 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__
及其特定端口。他们还应该在销毁时调用 parents __del__
方法来重置电机。
我知道在这种情况下我必须为子类定义一个 __init__
方法以使用我想要的端口启动但是 parents __del__
方法仍然会被调用如果我在子类中省略了 __del__
的定义?
这通常也适用于 __init__
吗?
提前致谢,如果这是重复的,我们深表歉意。
是的,这是可能的。如果您不覆盖子类中的方法,则将调用父方法。这也适用于 magic methods,如 __del__
或 __init__
。
这里是我运行在pythoncli中的一个小例子
>>> class A():
... def __del__(self):
... print('A.__del__')
...
>>> class B(A): pass
...
>>> b = B()
>>> del b
A.__del__
Class B
将包含 class A
的所有信息及其特定信息。
__init__
和__del__
只是构造和销毁钩子,虽然这个说法可以讨论。
对程序员来说重要的是你没有有去定义超级classcon/desctructor.如果不这样做,Python 会根据 方法解析顺序Python 在内部查找链中查找 con/destructor,即在基础 class(es) 中=24=] (MRO).
如果你想要一个con/destructor在派生class 和如果你想创建或销毁超class的实例变量(大多数时候你想这样做,因为这就是你首先派生的原因)或者做任何在超级 classes con/destructor 中完成的事情,那么你将不得不调用super classes 相应的方法。
这并没有明确地完成,因为 (a) Python 给了你不这样做的机会,并且 (b) Python Zen 说:"Explicit is better than implicit".