Что такое композиция в ООП и чем она отличается от наследования

«Что такое композиция в ООП и чем она отличается от наследования» — вопрос из категории ООП, который задают на 23% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Композиция — это принцип объектно-ориентированного программирования, при котором один класс включает в себя экземпляры других классов для построения более сложных объектов. Это реализует отношение "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()
# Вывод:
# Запускаем автомобиль...
# Двигатель запущен