CCCPaste

78cecf128402f

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