Menu
Coddy logo textTech

Service de location de véhicules

Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 64 sur 64.

challenge icon

Défi

Moyen

Dans 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 Vehicle
  • car.py - Implémenter la sous-classe Car
  • motorcycle.py - Implémenter la sous-classe Motorcycle
  • rental.py - Implémenter la classe Rental
  • rentalagency.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 Vehicle avec des propriétés et des méthodes communes
  • Des sous-classes Car et Motorcycle qui héritent de Vehicle
  • Une classe Rental pour gérer les transactions de location individuelles
  • Une classe RentalAgency pour 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