super(): как это работаетСегодня мы разберём одно из ключевых понятий объектно-ориентированного программирования в Python —
super(). Когда мы работаем с наследованием, то порой сталкиваемся с дублированием кода:
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
def raise_salary(self, amount):
self.salary += amount
class Manager(Employee):
def __init__(self, name, salary, department):
self.name = name
self.salary = salary
self.department = department
На первый взгляд, всё верно. Но посмотрите внимательно — часть кода в
Manager.__init__ дублирует логику базового класса Employee. В больших проектах уследить за всеми такими повторениями становится трудоемко. Решение простое — использовать super():
class Manager(Employee):
def __init__(self, name, salary, department):
super().__init__(name, salary)
self.department = department
Теперь
Manager вызывает конструктор базового класса Employee, а значит:🔘 Код становится короче;
🔘 Меньше ошибок при рефакторинге.
Как это работает под капотом
Многие думают, что
super() — это функция. На самом деле это класс. При его вызове возвращается прокси-объект, который даёт доступ к методам родительского класса. То есть строка:
super().__init__(name, salary)
означает:
«Возьми ближайший родительский класс в иерархии и вызови его метод `__init__()`».
Что важно помнить
🔘
super() работает не только в __init__. Его можно использовать в любых методах, которые переопределяются в подклассе;🔘 Можно вызывать
super() без аргументов — контекст определяется автоматически;🔘 В сложных системах с множественным наследованием
super() работает через механизм Method Resolution Order (MRO). Это гарантирует, что каждый базовый класс вызывается ровно один раз.#основы
@zen_of_python