#python #oop #inheritance #init #super
#python #ооп #наследование #инициализация #супер
Вопрос:
Если родительский класс и дочерний класс требуют того же __init__
, я могу придумать два основных способа сделать это…
1. Используйте super() для явного объявления __init__
class Parent:
def __init__(self, attr1, attr2):
self.attr1 = attr1
self.attr2 = attr2
class Child(Parent):
def __init__(self, attr1, attr2):
super().__init__(attr1, attr2)
def do_something(self):
return self.attr1 self.attr2
2. Просто наследовать __init__
class Parent:
def __init__(self, attr1, attr2):
self.attr1 = attr1
self.attr2 = attr2
class Child(Parent):
def do_something(self):
return self.attr1 self.attr2
Есть ли здесь предпочтительный подход? Базовое наследование должно работать (и, похоже, работает), но лучше ли быть явным в том, как инициализируется экземпляр объекта (унаследованный или нет)?
Основная причина, по которой я спрашиваю, заключается в том, что я никогда не видел примеров __init__
пропуска, но это может быть просто потому, что обычно __init__
поведение необходимо изменить или добавить.
(Я пробовал искать / читать множество других вопросов и не смог найти ответа, поэтому прошу прощения, если это дубликат.)
Спасибо!
Комментарии:
1. Если вам это не нужно, удалите его IMO. Дополнительный уровень дублирования / косвенности — это еще одна вещь, которая может сломаться.
Ответ №1:
Если конструктор в Child
идентичен, нет причин переопределять его. Поэтому я бы, конечно, выбрал решение 2, поскольку решение 1 не добавляет ничего, кроме репликации кода. Если вы следовали подходу 1, изменение Parent.__init__
также потребует изменения всех подклассов __init__
.
В обоих решениях вы забыли получить доступ к атрибутам, self
хотя (это должно быть self.attr1
, а не attr1
).