В чем разница между композицией и наследованием в Python

Ответ

Наследование и композиция — это два основных механизма для построения отношений между классами в ООП.

Наследование (отношение "является" / is-a)

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

Пример: Dog является Animal.

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        raise NotImplementedError("Subclass must implement abstract method")

class Dog(Animal): # Dog наследует от Animal
    def speak(self):
        return f"{self.name} says Woof!"

Композиция (отношение "имеет" / has-a)

Композиция — это подход, при котором один класс содержит экземпляр другого класса в качестве своего атрибута. Это позволяет создавать сложные объекты из более простых частей.

Пример: Car имеет Engine.

class Engine:
    def start(self):
        return "Engine started"

class Car:
    def __init__(self):
        self.engine = Engine() # Car содержит экземпляр Engine

    def start(self):
        print("Starting the car...")
        return self.engine.start()

Сравнение

Критерий Наследование Композиция
Тип связи is-a (жесткая связь) has-a (гибкая связь)
Гибкость Низкая. Изменения в базовом классе влияют на всех потомков. Высокая. Внутренние объекты можно легко заменять.
Переиспользование Переиспользуется реализация родителя. Переиспользуется интерфейс вложенного объекта.

Основной принцип: "Предпочитайте композицию наследованию" (Composition over inheritance). Композиция ведет к созданию более гибких, слабосвязанных и легко тестируемых систем.