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() критически важно для корректной инициализации всех уровней иерархии, особенно при множественном наследовании.
- Избыточное наследование может сделать код запутанным; иногда лучше использовать композицию (вложение объектов).