🧁 Composición
Dentro del método iniciador podemos guardar en los atributos nuevas instancias de otras clases. Por ejemplo, un clase Humano
puede componerse de otras clases como Cerebro
, Corazon
y Piernas
. O una clase Empleado
puede componerse de una clase Salario
.
A diferencia de la agregación, la clase que compone a otra clase depende de esta, es decir, una clase Corazon
no puede existir sin la clase Humano
.
✏️ Ejemplos
Ejemplo de una clase Humano con composición
class Humano:
def __init__(self):
self.corazon = Corazon() # Guardamos una instancia de la clase Corazon en el atributo corazon
self.cerebro = Cerebro() # Guardamos una instancia de la clase Cerebro en el atributo cerebro
self.piernas = [Pierna("izquierda"), Pierna("derecha")] # También podemos guardar instancias en una lista
class Corazon:
def __init__(self):
pass
class Cerebro:
def __init__(self):
pass
class Pierna:
def __init__(self, lado):
self.lado = lado
También podemos pasar nuestros atributos del constructor a las otras clases en el método iniciador
Ejemplo de una clase Empleado con composición
class Salario:
def __init__(self, cantidad):
self.__cantidad = cantidad
def getCantidad(self):
return self.__cantidad
class Empleado:
def __init__(self, nombre, salario):
self.__nombre = nombre
self.__salario = Salario(salario)
def getNombre(self):
return self.__nombre
def getSalario(self):
return self.__salario
def getSalarioMensual(self):
return self.__salario.getCantidad() # Podemos usar self y notación punto para acceder a los métodos de la clase compuesta
def getSalarioAnual(self):
return self.__salario.getCantidad() * 12
unEmpleado = Empleado("Christopher", 10000000)
print(f"{unEmpleado.getNombre()} gana ${unEmpleado.getSalario().getCantidad()} al mes") # Obtenemos el salario con el método de Salario
print(f"{unEmpleado.getNombre()} gana ${unEmpleado.getSalarioMensual()} al mes") # Obtenemos el salario con el método de Empleado
print(f"{unEmpleado.getNombre()} gana ${unEmpleado.getSalarioAnual()} al año")