Ответ
Агрегация и композиция — это типы ассоциации, описывающие отношение «часть-целое» (has-a). Ключевое различие заключается в силе связи и времени жизни связанных объектов.
Агрегация (слабая связь, 'имеет')
Объект-часть может существовать независимо от объекта-контейнера. Их жизненные циклы не связаны.
- Связь: Независимая.
- Жизненный цикл: Уничтожение контейнера не приводит к уничтожению его частей.
- Пример: Кафедра и Профессора. Профессор может существовать без кафедры или перейти на другую.
class Professor:
def __init__(self, name):
self.name = name
class Department:
def __init__(self, professors):
# Кафедра получает список уже существующих профессоров
self.professors = professors
prof1 = Professor("Dr. Smith")
prof2 = Professor("Dr. Jones")
# prof1 и prof2 существуют независимо
cs_department = Department([prof1, prof2])
Композиция (сильная связь, 'состоит из')
Объект-часть не может существовать без объекта-контейнера. Жизненный цикл частей полностью управляется контейнером.
- Связь: Зависимая, владеющая.
- Жизненный цикл: При уничтожении контейнера уничтожаются и все его части.
- Пример: Автомобиль и Двигатель. Двигатель не существует отдельно от конкретного автомобиля.
class Engine:
def __init__(self, horsepower):
self.horsepower = horsepower
class Car:
def __init__(self, hp):
# Двигатель создается внутри автомобиля и принадлежит ему
self.engine = Engine(hp)
# Создание Car автоматически создает Engine
my_car = Car(200)
# Если my_car будет удален сборщиком мусора, его engine также будет удален
Итог: Выбор зависит от логической связи. Если 'часть' немыслима без 'целого' — это композиция. В противном случае — агрегация.