Что такое переопределение методов (method overriding) в Python?

Ответ

Переопределение метода (method overriding) — это механизм ООП, позволяющий дочернему классу предоставить собственную реализацию метода, который уже определён в родительском классе.

Когда метод вызывается у объекта дочернего класса, исполняется именно его версия, а не версия родительского класса. В Python для этого не нужны специальные ключевые слова — достаточно объявить в дочернем классе метод с тем же именем.

Пример:

class Animal:
    def make_sound(self):
        print("Издает какой-то звук")

class Dog(Animal):
    # Переопределяем метод родительского класса
    def make_sound(self):
        print("Гав! Гав!")

animal = Animal()
dog = Dog()

animal.make_sound() # Вывод: Издает какой-то звук
dog.make_sound()    # Вывод: Гав! Гав!

Расширение, а не замена, с помощью super()

Часто требуется не полностью заменить, а расширить поведение родительского метода. Для вызова реализации из родительского класса используется встроенная функция super().

class Car:
    def __init__(self, brand):
        self.brand = brand
        print(f"Создан автомобиль марки {self.brand}.")

class ElectricCar(Car):
    def __init__(self, brand, battery_size):
        # Сначала вызываем __init__ родительского класса
        super().__init__(brand)
        # Затем добавляем свою логику
        self.battery_size = battery_size
        print(f"Это электромобиль с батареей {self.battery_size} кВт⋅ч.")

my_tesla = ElectricCar("Tesla", 100)

Начиная с Python 3.12, можно использовать декоратор @typing.override для явного указания намерения переопределить метод, что помогает статическим анализаторам находить ошибки.