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