Что делает функция super() в Python и в каких случаях её используют?

«Что делает функция super() в Python и в каких случаях её используют?» — вопрос из категории ООП, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Функция super() в Python предоставляет доступ к методам родительского класса (или класса-предка) из дочернего класса. Это позволяет расширять, а не полностью переопределять функциональность родителя.

Основная цель — обеспечить корректную работу в иерархиях наследования, особенно при множественном наследовании, следуя Method Resolution Order (MRO) — порядку разрешения методов.

Ключевые сценарии использования:

  1. Вызов конструктора родителя: Самый частый случай — вызов __init__ родительского класса для инициализации его полей.
  2. Расширение методов: Вызов родительской версии метода с последующим добавлением новой логики в дочернем классе.

Пример:

class Animal:
    def __init__(self, name):
        print("Animal __init__ called")
        self.name = name

    def speak(self):
        return f"{self.name} издает звук."

class Dog(Animal):
    def __init__(self, name, breed):
        print("Dog __init__ called")
        # Вызываем конструктор родительского класса Animal
        super().__init__(name)
        self.breed = breed

    def speak(self):
        # Вызываем родительский метод и дополняем его
        animal_sound = super().speak()
        return f"{animal_sound} Гав!"

dog = Dog("Рекс", "Овчарка")
print(dog.speak())

# Вывод:
# Dog __init__ called
# Animal __init__ called
# Рекс издает звук. Гав!

Использование super() вместо прямого вызова ParentClass.__init__(self, ...) делает код более гибким и поддерживаемым, так как он не привязан к конкретному имени родительского класса и корректно работает при изменении иерархии наследования.