Ответ
Композиция — это принцип объектно-ориентированного программирования, при котором один класс включает в себя экземпляры других классов для построения более сложных объектов. Это реализует отношение "has-a" (имеет), где объект-контейнер является "целым", а вложенные объекты — его "частями".
В отличие от наследования (отношение "is-a"), композиция обеспечивает большую гибкость и слабую связанность между компонентами.
Основные преимущества
- Гибкость: Поведение объекта можно изменять во время выполнения, заменяя его составные части.
- Инкапсуляция: Внутреннее устройство компонентов скрыто от внешнего мира.
- Избежание проблем наследования: Помогает обойти проблему "хрупкого базового класса", когда изменения в родительском классе ломают дочерние.
Этот подход соответствует известному принципу проектирования: "предпочитайте композицию наследованию".
Пример: Автомобиль и Двигатель
Автомобиль имеет двигатель. Двигатель — это часть автомобиля, но не его разновидность.
class Engine:
"""Компонент: Двигатель"""
def start(self):
print("Двигатель запущен")
class Car:
"""Контейнер: Автомобиль, использующий композицию"""
def __init__(self):
# Экземпляр Engine создается внутри Car и полностью им управляется
self.engine = Engine()
def start(self):
print("Запускаем автомобиль...")
self.engine.start()
# Создаем автомобиль, который автоматически создает свой двигатель
my_car = Car()
my_car.start()
# Вывод:
# Запускаем автомобиль...
# Двигатель запущен