Ответ
Наследование и композиция — это два основных механизма для построения отношений между классами в ООП.
Наследование (отношение "является" / 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). Композиция ведет к созданию более гибких, слабосвязанных и легко тестируемых систем.