Skip to content

Inheritance

Определение#

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

Для чего?#

Наследование систематизирует код, позволяя выстраивать иерархии от общих понятий к более узким. Оно избавляет от ручного копирования функций, формируя базовую логику в одном месте для всех "потомков".

Этот механизм закрепляет принцип is-a («является»), при котором любой подкласс по умолчанию считается полноценным представителем своего родительского типа.

Разница Полиморфизма и Наследования#

  • Полиморфизм позволяет вызывать одинаковые методы у объектов разных типов, и каждый из них выполняет эти вызовы по‑своему.
  • Наследование позволяет унаследовать общий набор методов от родительского класса и расширять/переопределять его в потомках.

Главная идея Полиморфизма: один интерфейс — много реализаций.
Главная идея Наследования: общее поведение от родительского класса и расширение/переопределение его в дочерних классах.

Механизмы наследования#

Наследование делает классы гибкими и расширяемыми:

  • Reuse (переиспользование кода) — базовый функционал пишется один раз в родительском классе.
  • Extending (расширение) — дочерний класс добавляет свои уникальные методы и данные.
  • Overriding (переопределение) — дочерний класс может изменить поведение метода родителя.

С помощью функции super() дочерний класс может вызвать оригинальную версию метода из родительского класса.

​В Python поддерживается как одиночное, так и множественное наследование:

  • Single Inheritance — классическое наследование от одного предка.
  • Multiple Inheritance — возможность наследоваться от нескольких классов сразу.
  • MRO — Method Resolution Order, порядок, в котором Python ищет методы в иерархии предков.
Понятие Суть Инструмент
Parent Базовый класс (суперкласс), от которого наследуют BaseClass
Child Производный класс (подкласс), который наследует class Child(BaseClass):
super() Прокси-объект для доступа к методам родителя super().method()

super() позволяет сначала выполнить стандартные действия предка, а потом добавить свои уникальные, подобно декоратору, но внутри, а не снаружи.

Пример#

    class Device:
        def __init__(self, brand: str):
            self.brand = brand

        def turn_on(self):
            print(f"{self.brand} включён")

    class Smartphone(Device):  # Наследование от Device
        def __init__(self, brand: str, model: str):
            # Вызов конструктора родителя через super()
            super().__init__(brand)
            self.model = model

        def turn_on(self):
            # Переопределение метода с сохранением базовой логики
            super().turn_on()
            print(f"Загрузка системы {self.model}...")

    phone = Smartphone("Apple", "iPhone 15")
    phone.turn_on()
    # Вывод:
    # Apple включён
    # Загрузка системы iPhone 15...

Ключевые мысли#

  • Наследование позволяет создавать специализированные классы без повторного написания базовой логики.
  • Использование super() критически важно для корректной инициализации всех уровней иерархии, особенно при множественном наследовании.
  • Избыточное наследование может сделать код запутанным; иногда лучше использовать композицию (вложение объектов).

Теги#