Service de location de véhicules
Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 64 sur 64.
Défi
MoyenDans ce défi, vous allez implémenter un système de location de véhicules. Le système modélise des véhicules, des locations et une agence de location avec un héritage et une encapsulation appropriés.
vehicle.py- Implémenter la classe de base Vehiclecar.py- Implémenter la sous-classe Carmotorcycle.py- Implémenter la sous-classe Motorcyclerental.py- Implémenter la classe Rentalrentalagency.py- Implémenter la classe RentalAgency
Chaque fichier contient des commentaires TODO détaillés guidant votre implémentation. Suivez ces commentaires pour vous assurer que votre code répond à toutes les exigences.
Aide-mémoire
Ce défi se concentre sur la mise en œuvre d'un système de location de véhicules en utilisant les principes de la programmation orientée objet, notamment l'héritage et l'encapsulation. Le système se compose de plusieurs classes travaillant ensemble pour modéliser une entreprise de location complète.
La mise en œuvre implique la création de :
- Une classe de base
Vehicleavec des propriétés et des méthodes communes - Des sous-classes
CaretMotorcyclequi héritent de Vehicle - Une classe
Rentalpour gérer les transactions de location individuelles - Une classe
RentalAgencypour coordonner l'ensemble du système de location
Essayez vous-même
from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from rental import Rental
from rentalagency import RentalAgency
# Gestionnaire de cas de test complet
test_case = input()
if test_case == "create_vehicles":
# Tester la création de véhicules
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
print(car)
print(bike)
elif test_case == "rental_workflow":
# Tester le flux de travail de location
agency = RentalAgency("Quick Rentals")
# Ajouter des véhicules
car = Car("C123", "Toyota", "Camry", 50, 5)
bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
agency.add_vehicle(car)
agency.add_vehicle(bike)
# Vérifier les véhicules disponibles
print(f"Available before rental: {len(agency.available_vehicles())}")
# Louer un véhicule
rental_id = agency.rent_vehicle("C123", "John Doe", 3)
print(f"Rental created: {rental_id}")
# Vérifier les véhicules disponibles après la location
print(f"Available after rental: {len(agency.available_vehicles())}")
# Retourner le véhicule
agency.return_vehicle(rental_id)
# Vérifier les véhicules disponibles après le retour
print(f"Available after return: {len(agency.available_vehicles())}")
elif test_case == "rental_cost":
# Tester le calcul du coût de location
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":
# Tester les méthodes 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":
# Tester les relations d'héritage
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":
# Tester le comportement polymorphe
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":
# Tester les cas limites de location
agency = RentalAgency("Edge Rentals")
# Essayer de louer un véhicule inexistant
print(f"Rent non-existent: {agency.rent_vehicle('X999', 'John Doe', 3)}")
# Ajouter une voiture et la louer
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}")
# Essayer de louer la même voiture à nouveau
print(f"Rent unavailable car: {agency.rent_vehicle('C123', 'Jane Smith', 2)}")
# Essayer de retourner une location inexistante
print(f"Return non-existent rental: {agency.return_vehicle('R999')}")
# Retourner la location valide
print(f"Return valid rental: {agency.return_vehicle(rental_id)}")
# Essayer de retourner la même location à nouveau
print(f"Return completed rental: {agency.return_vehicle(rental_id)}")
elif test_case == "agency_operations":
# Tester les opérations complètes de l'agence
agency = RentalAgency("Full Service Rentals")
# Ajouter 5 véhicules
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())}")
# Louer 3 véhicules
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())}")
# Retourner 2 véhicules
agency.return_vehicle(rental_ids[0])
agency.return_vehicle(rental_ids[1])
print(f"Available after returns: {len(agency.available_vehicles())}")
# Afficher les véhicules disponibles
print("Available vehicles:")
for v in agency.available_vehicles():
print(f" {v}")
elif test_case == "stress_test":
# Test de résistance avec de nombreux véhicules
agency = RentalAgency("Stress Test Rentals")
# Ajouter 100 véhicules
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)
# Louer 50 véhicules
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())}")
# Retourner toutes les locations
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":
# Tester avec des entrées invalides
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()}")Toutes les leçons de Object Oriented Programming
1Les fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe paramètre selfMéthodesAttributsMéthode constructeur (__init__)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLa fonction super()Redéfinition de méthodeHéritage multipleOrdre de résolution des méthodesRécapitulatif - Hiérarchie des employés7Méthodes spéciales
Introduction aux méthodes magiquesSurcharge d'opérateursMéthodes magiques de conteneurRécapitulatif - Liste personnalisée10Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy13Défis finaux
Plateforme d'e-learningSystème bancaireDéveloppement de personnages de jeuService de location de véhicules2Décorateurs
Introduction aux décorateursDécorateur de propriétéDécorateur de méthode statiqueDécorateur de méthode de classe5Polymorphisme
Retour sur la redéfinition de méthodeDuck TypingClasses et méthodes abstraitesConception d'interfacesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageMixinsMéthodes statiques et de classeDécorateurs de classeGestionnaires de contexte11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Propriétés de classe
Variables d'instance vs variables de classeDécorateurs de propriétéAttributs privésRécapitulatif - Gestionnaire de compte bancaire