Наследование Python: необходимо ли явно вызывать родительский конструктор и деструктор?
У меня есть некоторый код (для 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 ответа
__init__
а также __del__
являются просто крюками конструкции и разрушения, хотя это утверждение может быть предметом обсуждения.
Для программиста важно то, что вам не нужно определять суперкласс con/desctructor. Если вы этого не сделаете, Python ищет кон / деструктор во внутренней цепочке поиска, то есть в базовом классе (классах), в соответствии с порядком разрешения методов (MRO).
Если вам нужен кон / деструктор в производном классе, и если вы хотите создать или уничтожить переменные экземпляра суперкласса (и большую часть времени вы хотите это сделать, именно поэтому вы производили в первую очередь) или выполните что бы ни делалось в con / destructor суперклассов, вам придется соответственно вызывать методы суперклассов.
Это не сделано явно, потому что (а) Python дает вам возможность этого не делать и (б) Python Zen говорит: "Явное лучше, чем неявное".
Да, это возможно. Если вы не переписываете метод внутри подкласса, вместо него будет вызван родительский метод. Это также верно для магических методов, таких как __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
смешанный с его конкретной информацией.