Наследование 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 смешанный с его конкретной информацией.

Другие вопросы по тегам