Как сделать наследование в Python и зачем нужен super()?
Хочу, чтобы один класс брал поведение другого и что-то добавлял своё. Как это правильно сделать и что за super() все вызывают в __init__?
3 ответа
Наследование: указываешь родителя в скобках после имени класса, и дочерний класс автоматически получает все его методы.
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() = "обратись к родителю". Главное правило новичку: если переопределяешь __init__ в наследнике — почти всегда зови super().__init__(...), иначе потеряешь инициализацию родителя.
Наследование — это про "является": собака является животным. Если связь "имеет" (у машины есть двигатель) — это не наследование, а композиция, не путай.