Короткий ответ
Наследование позволяет классу-потомку переиспользовать и переопределять атрибуты и методы родительского класса; super() даёт доступ к методам родителя из переопределённого метода потомка, что позволяет дополнить, а не полностью заменить родительскую логику.
Как это работает подробнее
При определении class Child(Parent): потомок автоматически получает все методы и атрибуты родителя, которые не переопределены явно. Вызов super().method(...) внутри потомка ищет реализацию method выше по цепочке наследования (согласно порядку MRO) и вызывает её с текущим self.
Пример кода
example.py
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
def describe(self):
return f"{self.name}, зарплата {self.salary}"
class Manager(Employee):
def __init__(self, name, salary, team_size):
super().__init__(name, salary) # инициализация родительской части
self.team_size = team_size
def describe(self):
base = super().describe() # дополняем, а не заменяем
return f"{base}, команда из {self.team_size} человек"
m = Manager("Анна", 150000, 5)
print(m.describe()) # Анна, зарплата 150000, команда из 5 человекЧто использовать на практике
- Практика. Чаще всего
super().__init__(...)вызывают в начале__init__потомка, чтобы родительский класс корректно инициализировал свою часть состояния, а потомок — только добавил своё. Это избавляет от дублирования кода инициализации и сохраняет правильное поведение при изменении родительского класса.
Подводные камни
- Риски. Полностью переопределяют метод потомка без вызова
super(), из-за чего теряется важная логика родителя (например, не выполняется обязательная валидация из базового класса). Также обращаются к родителю напрямую по имени класса (Parent.method(self)) вместоsuper(), что усложняет поддержку при изменении иерархии наследования.