Servizio di noleggio veicoli
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 64 di 64.
Sfida
MedioIn questa sfida implementerai un sistema di noleggio veicoli. Il sistema modella veicoli, noleggi e un'agenzia di noleggio, con ereditarietà e incapsulamento adeguati.
vehicle.py- Implementa la classe base Vehiclecar.py- Implementa la sottoclasse Carmotorcycle.py- Implementa la sottoclasse Motorcyclerental.py- Implementa la classe Rentalrentalagency.py- Implementa la classe RentalAgency
Ogni file contiene commenti TODO dettagliati che guidano la tua implementazione. Segui questi commenti per assicurarti che il tuo codice soddisfi tutti i requisiti.
Provalo tu
from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from rental import Rental
from rentalagency import RentalAgency
# Gestore completo dei casi di test
test_case = input()
if test_case == "create_vehicles":
# Verifica la creazione dei veicoli
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
print(car)
print(bike)
elif test_case == "rental_workflow":
# Verifica il flusso di noleggio
agency = RentalAgency("Quick Rentals")
# Aggiungi veicoli
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
agency.add_vehicle(car)
agency.add_vehicle(bike)
# Controlla i veicoli disponibili
print(f"Available before rental: {len(agency.available_vehicles())}")
# Noleggia un veicolo
rental_id = agency.rent_vehicle("C123", "John Doe", 3)
print(f"Rental created: {rental_id}")
# Controlla i veicoli disponibili dopo il noleggio
print(f"Available after rental: {len(agency.available_vehicles())}")
# Restituisci il veicolo
agency.return_vehicle(rental_id)
# Controlla i veicoli disponibili dopo la restituzione
print(f"Available after return: {len(agency.available_vehicles())}")
elif test_case == "rental_cost":
# Verifica il calcolo del costo del noleggio
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":
# Verifica i metodi di 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":
# Verifica le relazioni di ereditarietà
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":
# Verifica il comportamento polimorfico
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":
# Verifica i casi limite del noleggio
agency = RentalAgency("Edge Rentals")
# Prova a noleggiare un veicolo inesistente
print(f"Rent non-existent: {agency.rent_vehicle('X999', 'John Doe', 3)}")
# Aggiungi un'auto e noleggiala
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}")
# Prova a noleggiare di nuovo la stessa auto
print(f"Rent unavailable car: {agency.rent_vehicle('C123', 'Jane Smith', 2)}")
# Prova a restituire un noleggio inesistente
print(f"Return non-existent rental: {agency.return_vehicle('R999')}")
# Restituisci il veicolo del noleggio valido
print(f"Return valid rental: {agency.return_vehicle(rental_id)}")
# Prova a restituire di nuovo il veicolo dello stesso noleggio
print(f"Return completed rental: {agency.return_vehicle(rental_id)}")
elif test_case == "agency_operations":
# Verifica tutte le operazioni dell'agenzia
agency = RentalAgency("Full Service Rentals")
# Aggiungi 5 veicoli
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())}")
# Noleggia 3 veicoli
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())}")
# Restituisci 2 veicoli
agency.return_vehicle(rental_ids[0])
agency.return_vehicle(rental_ids[1])
print(f"Available after returns: {len(agency.available_vehicles())}")
# Stampa i veicoli disponibili
print("Available vehicles:")
for v in agency.available_vehicles():
print(f" {v}")
elif test_case == "stress_test":
# Test di carico con molti veicoli
agency = RentalAgency("Stress Test Rentals")
# Aggiungi 100 veicoli
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)
# Noleggia 50 veicoli
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())}")
# Restituisci tutti i veicoli noleggiati
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":
# Test con input non validi
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()}")Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy13Sfide finali
Piattaforma di e-learningSistema bancarioSviluppo di un personaggio di giocoServizio di noleggio veicoli2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online