Ответ
Оператор super предоставляет доступ к методам и атрибутам родительского (или соседнего в MRO) класса из дочернего класса. Это основной механизм для расширения функциональности унаследованных методов.
Основные случаи использования:
- Вызов конструктора родительского класса: Для корректной инициализации унаследованной части объекта.
- Обращение к переопределенным методам: Чтобы использовать реализацию родителя в дополнение к новой логике в дочернем классе.
- Работа с множественным наследованием: В языках вроде Python
super()следует порядку разрешения методов (MRO), что делает код более предсказуемым.
Пример в Python:
class Vehicle:
def __init__(self, brand):
self.brand = brand
self.engine_started = False
def start_engine(self):
self.engine_started = True
return f"{self.brand}: Двигатель запущен."
class Car(Vehicle):
def __init__(self, brand, model):
# Вызов конструктора родительского класса Vehicle
super().__init__(brand)
# Добавление собственного атрибута
self.model = model
def start_engine(self):
# Расширение метода родителя: добавляем логирование
print("Проверка систем автомобиля...")
# Вызов оригинального метода родителя
result = super().start_engine()
return f"{result} Модель: {self.model}"
my_car = Car("Toyota", "Camry")
print(my_car.start_engine())
# Вывод:
# Проверка систем автомобиля...
# Toyota: Двигатель запущен. Модель: Camry
Использование super() делает код устойчивым к изменениям в иерархии наследования, так как не требует явного указания имени родительского класса.