class Persona:
nombre: str
def __init__(self, nombre):
self.nombre = nombre
class Pasajero(Persona):
tipo: str
def __init__(self, nombre, tipo):
super().__init__(nombre)
self.tipo = tipo
print(f"Se ha creado al pasajero: {nombre} que es {tipo}")
class Motorizado:
marca: str
modelo: str
capacidad_pasajeros: int
pasajeros: list[Pasajero]
motor: str
def __init__(self, marca, modelo, capacidad_pasajeros):
self.marca = marca
self.modelo = modelo
self.capacidad_pasajeros = capacidad_pasajeros
self.pasajeros = [] # lista vacía al inicio
self.motor = "" # se agregará después (composición)
print(f"🚗 Se ha creado el motorizado: {self.marca} {self.modelo}")
def asignar_motor(self, motor):
self.motor = motor.tipo
print(f"Se ha asignado el motor {self.motor} al motorizado: {self.marca} {self.modelo}")
def subir_pasajero(self, persona):
if len(self.pasajeros) < self.capacidad_pasajeros:
self.pasajeros.append(persona)
print(f"{persona.nombre} subió al motorizado.")
else:
print(f"No hay espacio para {persona.nombre}")
def iniciar_viaje(self):
if self.motor is None:
print("No se puede iniciar el viaje sin motor 🚫")
return
print(f"El {self.marca} {self.modelo}, con motor {self.motor} ha iniciado el viaje con {len(self.pasajeros)} pasajeros 🚗💨")
class Motor:
def __init__(self, tipo):
self.tipo = tipo
def encender(self):
print(f"Motor {self.tipo} encendido 🔑")
class Auto(Motorizado):
def __init__(self, marca, modelo):
super().__init__(marca, modelo, capacidad_pasajeros=4)
self.llantas = 4
def subir_pasajeros(self, personas):
print("Subiendo pasajeros al Automovil...")
for pasajero in personas:
self.subir_pasajero(pasajero)
class Moto(Motorizado):
def __init__(self, marca, modelo):
super().__init__(marca, modelo, capacidad_pasajeros=1)
self.llantas = 2
def subir_pasajeros(self, personas):
print("Subiendo pasajeros a la Motocicleta...")
for persona in personas:
self.subir_pasajero(persona)
class Conductor(Persona):
motorizado: Motorizado
def __init__(self, nombre):
super().__init__(nombre)
self.motorizado = None # puede tener o no un auto
print(f"Se ha creado el/la conductor(a): {nombre}")
def asignar_motorizado(self, motorizado):
self.motorizado = motorizado
print(f"{self.nombre} es el conductor del {motorizado.marca} {motorizado.modelo}")
if __name__ == "__main__":
# Crear Moto
moto1 = Moto("Yamaha", "R3")
# Crear Auto
auto1 = Auto("Toyota", "Yaris")
# COMPOSICION: Sin Auto no hay Motor
motor_auto = Motor("a 'Gasolina'")
motor_moto = Motor("'Eléctrico'")
auto1.asignar_motor(motor_auto)
moto1.asignar_motor(motor_moto)
# Crear Conductores
juan = Conductor("Juan")
maria = Conductor("Maria")
# AGREGACION: El Conductor usa un Automovil (pero puede existir sin él).
juan.asignar_motorizado(auto1)
maria.asignar_motorizado(moto1)
# Crear Pasajeros
ana = Pasajero("Ana", "Adulto")
pedro = Pasajero("Pedro", "Niño")
luis = Pasajero("Luis", "Anciano")
# Subir pasajeros a Auto e iniciar el viaje:
auto1.subir_pasajeros([ana,pedro,luis])
auto1.iniciar_viaje()
# Subir pasajeros a Moto
moto1.subir_pasajeros([ana,luis])
moto1.iniciar_viaje()