В первой части нашего учебника мы познакомились с основами Python, включая переменные, типы данных, структуры данных (списки, кортежи, словари, множества), функции, работу с файлами, обработку исключений и базовые концепции объектно-ориентированного программирования (ООП).
Теперь пришло время углубиться в ООП и рассмотреть более сложные, но чрезвычайно мощные концепции. Наследование – это одна из фундаментальных идей ООП, позволяющая создавать элегантные иерархии кода и эффективно повторно использовать существующую функциональность.
1.1 Что такое наследование?
1.1 Что такое наследование?
Сущность наследования в объектно-ориентированном программировании
Наследование – это фундаментальный механизм объектно-ориентированного программирования, который позволяет создавать новые классы на основе существующих. Представьте себе семейную родословную: дети наследуют определенные черты от родителей, но при этом обладают своими уникальными особенностями. Аналогично в программировании дочерние классы наследуют атрибуты и методы родительских классов, одновременно расширяя или изменяя их функциональность.
Базовые термины и понятия
Родительский класс (базовый класс, суперкласс) – существующий класс, чьи свойства и поведение наследуются.
Дочерний класс (производный класс, подкласс) – новый класс, который наследует от родительского класса.
Иерархия наследования – структура отношений «родитель-потомок» между классами.
Концептуальная модель наследования
Наследование реализует отношение «is-a» (является). Если класс B наследует от класса A, это означает, что «B является A». Например:
Кошка является животным (Cat is an Animal)
Круг является фигурой (Circle is a Shape)
Менеджер является сотрудником (Manager is an Employee)
Эта семантическая связь – ключевой критерий правильного применения наследования.
Практическая необходимость наследования
1. Устранение дублирования кода
Без наследования нам пришлось бы копировать одинаковые методы и атрибуты в разные классы, что нарушает принцип DRY (Don’t Repeat Yourself).
2. Создание иерархий понятий
Наследование позволяет моделировать сложные предметные области, отражая естественные иерархии: Transport → Vehicle → Car → ElectricCar.
3. Полиморфизм и единообразие интерфейсов
Классы-наследники могут использоваться везде, где ожидается родительский класс, обеспечивая гибкость и расширяемость.
4. Постепенное усложнение функциональности
Можно создавать простые базовые классы и постепенно добавлять функциональность в производных классах.
Базовый пример наследования в Python
Рассмотрим простейший пример, демонстрирующий сущность наследования:
python
class Animal:
«„„Родительский класс Животное““»
def __init__ (self, name):
self.name = name
def speak (self):
return «Издает звук»
def move (self):
return f"{self.name} двигается»
class Cat (Animal): # Наследование от Animal
«„„Дочерний класс Кошка““»
def speak (self): # Переопределение метода
return «Мяу!»
def purr (self): # Новый метод
return «Муррр…»
# Использование
animal = Animal («Неизвестное животное»)
print (animal. speak ()) # Издает звук
cat = Cat («Барсик»)
print (cat. speak ()) # Мяу! (переопределенный метод)
print(cat.move ()) # Барсик двигается (унаследованный метод)
print (cat. purr ()) # Муррр… (новый метод)
Что именно наследуется?
При наследовании дочерний класс получает:
Все методы родительского класса (как обычные, так и статические, классовые)
Все атрибуты класса (но не экземпляра!)