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.
Desafío
IntermedioEn 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 Vehiclecar.py- Implementa la subclase Carmotorcycle.py- Implementa la subclase Motorcyclerental.py- Implementa la clase Rentalrentalagency.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
Vehiclecon propiedades y métodos comunes - Subclases
CaryMotorcycleque heredan de Vehicle - Una clase
Rentalpara gestionar transacciones de alquiler individuales - Una clase
RentalAgencypara 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
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases vs ObjetosEl parámetro selfMétodosAtributosMétodo constructor (__init__)Resumen - Calculadora simple4Herencia
Herencia básicaLa función super()Sobrescritura de métodosHerencia múltipleOrden de resolución de métodosResumen - Jerarquía de empleados7Métodos especiales
Introducción a los métodos mágicosSobrecarga de operadoresMétodos mágicos de contenedoresRepaso - Lista personalizada10Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy13Desafíos finales
Plataforma de e-learningSistema bancarioDesarrollo de personajes de videojuegosServicio de alquiler de vehículos2Decoradores
Introducción a los decoradoresDecorador propertyDecorador de métodos estáticosDecorador de métodos de clase5Polimorfismo
Sobreescritura de métodos revisitadaDuck TypingClases y métodos abstractosDiseño de interfacesResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaMixinsMétodos estáticos y de claseDecoradores de claseGestores de contexto11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Propiedades de clase
Variables de instancia vs de claseDecoradores de propiedadesAtributos privadosResumen - Gestor de cuentas bancarias