← Все вопросы

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

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

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

4 ответа

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)? · 18 месяцев назад
Милана Журавлёва @можно, но super() удобнее: не привязан к имени родителя и правильно работает при множественном наследовании · 18 месяцев назад
10

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

8

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

0

Наследование делается через указание родительского класса в скобках при объявлении класса: class Animal: def init(self, name, age): self.name = name self.age = age self.is_alive = True

class Dog(Animal): def init(self, name, age, breed): # ВЫЗЫВАЕМ родительский init, чтобы задать name, age, is_alive super().init(name, age)
# Добавляем своё self.breed = breed

dog = Dog("Бобик", 3, "Овчарка") print(dog.name) # Бобик (унаследовано) print(dog.age) # 3 (унаследовано) print(dog.is_alive) # True (унаследовано) print(dog.breed) # Овчарка (своё) super() позволяет вызывать методы родительского класса, не обращаясь к нему по имени напрямую.

Ваш ответ

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