Menu
Coddy logo textTech

Servicio de alquiler de vehículos

Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 64 de 64.

challenge icon

Desafío

Intermedio

En este desafío, implementarás un sistema de alquiler de vehículos. El sistema modela vehículos, alquileres y una agencia de alquiler con la herencia y el encapsulamiento adecuados.

  • vehicle.py - Implementa la clase base Vehicle
  • car.py - Implementa la subclase Car
  • motorcycle.py - Implementa la subclase Motorcycle
  • rental.py - Implementa la clase Rental
  • rentalagency.py - Implementa la clase RentalAgency

Cada archivo contiene comentarios TODO detallados que guían tu implementación. Sigue estos comentarios para asegurarte de que tu código cumpla con todos los requisitos.

Hoja de referencia

Este desafío se centra en la implementación de un sistema de alquiler de vehículos utilizando principios de programación orientada a objetos, incluyendo la herencia y el encapsulamiento. El sistema consta de múltiples clases que trabajan juntas para modelar un negocio de alquiler completo.

La implementación implica la creación de:

  • Una clase base Vehicle con propiedades y métodos comunes
  • Subclases Car y Motorcycle que heredan de Vehicle
  • Una clase Rental para gestionar transacciones de alquiler individuales
  • Una clase RentalAgency para coordinar todo el sistema de alquiler

Pruébalo tú mismo

from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from rental import Rental
from rentalagency import RentalAgency

# Manejador de casos de prueba exhaustivo
test_case = input()

if test_case == "create_vehicles":
    # Probar la creación de vehículos
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    
    print(car)
    print(bike)

elif test_case == "rental_workflow":
    # Probar el flujo de trabajo de alquiler
    agency = RentalAgency("Quick Rentals")
    
    # Añadir vehículos
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    agency.add_vehicle(car)
    agency.add_vehicle(bike)
    
    # Verificar vehículos disponibles
    print(f"Available before rental: {len(agency.available_vehicles())}")
    
    # Alquilar un vehículo
    rental_id = agency.rent_vehicle("C123", "John Doe", 3)
    print(f"Rental created: {rental_id}")
    
    # Verificar vehículos disponibles después del alquiler
    print(f"Available after rental: {len(agency.available_vehicles())}")
    
    # Devolver vehículo
    agency.return_vehicle(rental_id)
    
    # Verificar vehículos disponibles después de la devolución
    print(f"Available after return: {len(agency.available_vehicles())}")

elif test_case == "rental_cost":
    # Probar el cálculo del costo de alquiler
    car = Car("C123", "Toyota", "Camry", 50, 5)
    rental = Rental("R1", car, "John Doe", 3)
    print(f"Rental cost for 3 days: ${rental.calculate_cost()}")

elif test_case == "vehicle_methods":
    # Probar los métodos de Vehicle
    vehicle = Vehicle("V789", "Generic", "Vehicle", 25)
    print(vehicle)
    print(f"Start rental: {vehicle.start_rental()}")
    print(f"Start rental again: {vehicle.start_rental()}")
    print(f"End rental: {vehicle.end_rental()}")
    print(f"Start rental after end: {vehicle.start_rental()}")

elif test_case == "inheritance_check":
    # Probar las relaciones de herencia
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    
    print(f"Car is a Vehicle: {isinstance(car, Vehicle)}")
    print(f"Motorcycle is a Vehicle: {isinstance(bike, Vehicle)}")
    print(f"Car is a Motorcycle: {isinstance(car, Motorcycle)}")

elif test_case == "polymorphism":
    # Probar el comportamiento polimórfico
    vehicles = [
        Vehicle("V789", "Generic", "Vehicle", 25),
        Car("C123", "Toyota", "Camry", 50, 5),
        Motorcycle("M456", "Honda", "CBR", 35, 600)
    ]
    
    for i, v in enumerate(vehicles):
        print(f"Vehicle {i+1}: {v}")

elif test_case == "rental_edge_cases":
    # Probar casos de borde de alquiler
    agency = RentalAgency("Edge Rentals")
    
    # Intentar alquilar un vehículo inexistente
    print(f"Rent non-existent: {agency.rent_vehicle('X999', 'John Doe', 3)}")
    
    # Añadir un coche y alquilarlo
    car = Car("C123", "Toyota", "Camry", 50, 5)
    agency.add_vehicle(car)
    rental_id = agency.rent_vehicle("C123", "John Doe", 3)
    print(f"Valid rental: {rental_id}")
    
    # Intentar alquilar el mismo coche de nuevo
    print(f"Rent unavailable car: {agency.rent_vehicle('C123', 'Jane Smith', 2)}")
    
    # Intentar devolver un alquiler inexistente
    print(f"Return non-existent rental: {agency.return_vehicle('R999')}")
    
    # Devolver el alquiler válido
    print(f"Return valid rental: {agency.return_vehicle(rental_id)}")
    
    # Intentar devolver el mismo alquiler de nuevo
    print(f"Return completed rental: {agency.return_vehicle(rental_id)}")

elif test_case == "agency_operations":
    # Probar operaciones integrales de la agencia
    agency = RentalAgency("Full Service Rentals")
    
    # Añadir 5 vehículos
    vehicles = [
        Car("C1", "Toyota", "Camry", 50, 5),
        Car("C2", "Honda", "Accord", 55, 5),
        Car("C3", "Ford", "Focus", 45, 5),
        Motorcycle("M1", "Honda", "CBR", 35, 600),
        Motorcycle("M2", "Yamaha", "R1", 40, 1000)
    ]
    
    for v in vehicles:
        agency.add_vehicle(v)
    
    print(f"Available vehicles: {len(agency.available_vehicles())}")
    
    # Alquilar 3 vehículos
    rental_ids = [
        agency.rent_vehicle("C1", "Customer 1", 3),
        agency.rent_vehicle("C2", "Customer 2", 5),
        agency.rent_vehicle("M1", "Customer 3", 2)
    ]
    
    print(f"Available after rentals: {len(agency.available_vehicles())}")
    
    # Devolver 2 vehículos
    agency.return_vehicle(rental_ids[0])
    agency.return_vehicle(rental_ids[1])
    
    print(f"Available after returns: {len(agency.available_vehicles())}")
    
    # Imprimir vehículos disponibles
    print("Available vehicles:")
    for v in agency.available_vehicles():
        print(f"  {v}")

elif test_case == "stress_test":
    # Prueba de esfuerzo con muchos vehículos
    agency = RentalAgency("Stress Test Rentals")
    
    # Añadir 100 vehículos
    for i in range(100):
        if i % 2 == 0:
            vehicle = Car(f"C{i}", "Make{i}", f"Model{i}", 50, 5)
        else:
            vehicle = Motorcycle(f"M{i}", "Make{i}", f"Model{i}", 35, 600)
        agency.add_vehicle(vehicle)
    
    # Alquilar 50 vehículos
    rental_ids = []
    for i in range(50):
        vin = f"C{i*2}" if i % 2 == 0 else f"M{i*2-1}"
        rental_id = agency.rent_vehicle(vin, f"Customer{i}", 3)
        rental_ids.append(rental_id)
    
    print(f"Available after 50 rentals: {len(agency.available_vehicles())}")
    
    # Devolver todos los alquileres
    for rental_id in rental_ids:
        agency.return_vehicle(rental_id)
    
    print(f"Available after all returns: {len(agency.available_vehicles())}")

elif test_case == "invalid_inputs":
    # Probar con entradas inválidas
    car = Car("C123", "Toyota", "Camry", -50, 5)
    print(f"Car with negative rate: {car}")
    
    bike = Motorcycle("M456", "Honda", "CBR", 35, 0)
    print(f"Motorcycle with zero engine: {bike}")
    
    rental_zero = Rental("R1", car, "John Doe", 0)
    print(f"Rental with zero days cost: ${rental_zero.calculate_cost()}")
    
    rental_neg = Rental("R2", car, "Jane Smith", -3)
    print(f"Rental with negative days cost: ${rental_neg.calculate_cost()}")

Todas las lecciones de Object Oriented Programming