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()