Явная настройка унаследованного, без изменений __init__ против пропуска его в Python

#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 ).