← Все вопросы

Как сделать наследование в Python и зачем нужен super()?

Задан 17 месяцев назад1.1к просмотров3 ответа
20

Хочу, чтобы один класс брал поведение другого и что-то добавлял своё. Как это правильно сделать и что за super() все вызывают в __init__?

3 ответа

31
✓ Принятый ответ — помог автору

Наследование: указываешь родителя в скобках после имени класса, и дочерний класс автоматически получает все его методы.

super() нужен, чтобы вызвать метод родителя, не дублируя его код. Чаще всего — в __init__, чтобы родитель настроил свою часть, а ты добавил свою:

class Animal:
    def __init__(self, name):
        self.name = name
    def eat(self):
        print(f"{self.name} ест")

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)  # родитель ставит name
        self.breed = breed      # своё поле
    def bark(self):
        print("гав")

d = Dog("Рекс", "лайка")
d.eat()   # унаследовано от Animal
d.bark()  # своё

Без super().__init__(name) атрибут name просто не появился бы — родительский __init__ не вызвался бы сам по себе.

Данил Джалагания а можно без super просто Animal.__init__(self, name)? · 17 месяцев назад
Милана Журавлёва @можно, но super() удобнее: не привязан к имени родителя и правильно работает при множественном наследовании · 17 месяцев назад
10

super() = "обратись к родителю". Главное правило новичку: если переопределяешь __init__ в наследнике — почти всегда зови super().__init__(...), иначе потеряешь инициализацию родителя.

8

Наследование — это про "является": собака является животным. Если связь "имеет" (у машины есть двигатель) — это не наследование, а композиция, не путай.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект