Для чего используется оператор `super` в объектно-ориентированном программировании?

«Для чего используется оператор `super` в объектно-ориентированном программировании?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор super предоставляет доступ к методам и атрибутам родительского (или соседнего в MRO) класса из дочернего класса. Это основной механизм для расширения функциональности унаследованных методов.

Основные случаи использования:

  1. Вызов конструктора родительского класса: Для корректной инициализации унаследованной части объекта.
  2. Обращение к переопределенным методам: Чтобы использовать реализацию родителя в дополнение к новой логике в дочернем классе.
  3. Работа с множественным наследованием: В языках вроде 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() делает код устойчивым к изменениям в иерархии наследования, так как не требует явного указания имени родительского класса.