Agregación y Composición en Python: diferencias claras con ejemplos reales
Relaciones entre objetos en POO
En programación orientada a objetos no solo modelamos entidades, sino también las relaciones entre ellas. Dos de las relaciones más importantes son: agregación y composición.
Ambas representan una relación “tiene un”, pero la diferencia clave está en el ciclo de vida de los objetos.
Composición: relación fuerte (dependencia total)
La composición representa una relación fuerte. Un objeto no puede existir sin el otro. Si el objeto principal se destruye, sus componentes también.
Ejemplo conceptual: una Persona tiene un Corazón y un Cerebro. No existen de forma independiente dentro del modelo.
class Corazon:
def latir(self):
return "El corazón está latiendo"
class Cerebro:
def pensar(self):
return "El cerebro está pensando"
class Persona:
def __init__(self, nombre):
self.nombre = nombre
# La Persona crea sus propios componentes
self.corazon = Corazon()
self.cerebro = Cerebro()
def vivir(self):
return (
self.corazon.latir()
+ " y "
+ self.cerebro.pensar()
)
Aquí la Persona crea internamente su corazón y su cerebro. No se los pasan desde afuera. Si la persona deja de existir, sus componentes también.
Claves de la composición
- Relación fuerte
- El objeto contenido no tiene sentido sin el contenedor
- El ciclo de vida depende completamente del objeto principal
Agregación: relación débil (independencia parcial)
La agregación representa una relación más flexible. Un objeto puede existir independientemente del otro.
Ejemplo: una Persona puede tener un Auto o un Celular, pero esos objetos pueden existir sin esa persona.
class Auto:
def __init__(self, marca):
self.marca = marca
def encender(self):
return "El auto está encendido"
class Celular:
def __init__(self, modelo):
self.modelo = modelo
def llamar(self):
return "Realizando llamada"
class Persona:
def __init__(self, nombre, auto, celular):
self.nombre = nombre
# Los objetos se pasan desde afuera
self.auto = auto
self.celular = celular
def usar_auto(self):
return self.auto.encender()
def usar_celular(self):
return self.celular.llamar()
En este caso, el Auto y el Celular se crean fuera de la clase Persona y luego se inyectan. Pueden existir sin ella.
Claves de la agregación
- Relación débil
- Los objetos pueden existir de forma independiente
- No comparten necesariamente el mismo ciclo de vida
Diferencias resumidas
| Característica | Composición | Agregación |
|---|---|---|
| Tipo de relación | Fuerte | Débil |
| Ciclo de vida | Dependiente | Independiente |
| Creación del objeto | Interna | Externa |
| Ejemplo | Persona – Corazón – Cerebro | Persona – Auto – Celular |
Conclusión
La diferencia entre agregación y composición no es sintáctica, sino conceptual. Ambas usan clases y atributos, pero el significado del vínculo cambia.
Si el objeto contenido no puede existir sin el principal, estamos ante composición.
Si el objeto puede vivir por separado y simplemente se asocia, estamos ante agregación.
Comprender esta diferencia te ayuda a modelar mejor tus sistemas y tomar decisiones más sólidas al diseñar arquitectura orientada a objetos.