Menu
Coddy logo textTech

Fahrzeugvermietung

Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 64 von 64.

challenge icon

Aufgabe

Mittel

In dieser Challenge implementieren Sie ein Fahrzeugvermietungssystem. Das System modelliert Fahrzeuge, Vermietungen und eine Mietwagenagentur mit korrekter Vererbung und Kapselung.

  • vehicle.py - Implementieren Sie die Basisklasse Vehicle
  • car.py - Implementieren Sie die Unterklasse Car
  • motorcycle.py - Implementieren Sie die Unterklasse Motorcycle
  • rental.py - Implementieren Sie die Klasse Rental
  • rentalagency.py - Implementieren Sie die Klasse RentalAgency

Jede Datei enthält detaillierte TODO-Kommentare, die Sie bei der Implementierung unterstützen. Befolgen Sie diese Kommentare, um sicherzustellen, dass Ihr Code alle Anforderungen erfüllt.

Spickzettel

Diese Herausforderung konzentriert sich auf die Implementierung eines Fahrzeugvermietungssystems unter Verwendung objektorientierter Programmierprinzipien, einschließlich Vererbung und Kapselung. Das System besteht aus mehreren Klassen, die zusammenarbeiten, um ein vollständiges Vermietungsgeschäft zu modellieren.

Die Implementierung umfasst die Erstellung von:

  • Eine Basisklasse Vehicle mit gemeinsamen Eigenschaften und Methoden
  • Unterklassen Car und Motorcycle, die von Vehicle erben
  • Eine Klasse Rental zur Verwaltung einzelner Miettransaktionen
  • Eine Klasse RentalAgency zur Koordination des gesamten Vermietungssystems

Probier es selbst

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

# Umfassender Testfall-Handler
test_case = input()

if test_case == "create_vehicles":
    # Teste Fahrzeugerstellung
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    
    print(car)
    print(bike)

elif test_case == "rental_workflow":
    # Teste Miet-Workflow
    agency = RentalAgency("Quick Rentals")
    
    # Fahrzeuge hinzufügen
    car = Car("C123", "Toyota", "Camry", 50, 5)
    bike = Motorcycle("M456", "Honda", "CBR", 35, 600)
    agency.add_vehicle(car)
    agency.add_vehicle(bike)
    
    # Verfügbare Fahrzeuge prüfen
    print(f"Available before rental: {len(agency.available_vehicles())}")
    
    # Ein Fahrzeug mieten
    rental_id = agency.rent_vehicle("C123", "John Doe", 3)
    print(f"Rental created: {rental_id}")
    
    # Verfügbare Fahrzeuge nach der Vermietung prüfen
    print(f"Available after rental: {len(agency.available_vehicles())}")
    
    # Fahrzeug zurückgeben
    agency.return_vehicle(rental_id)
    
    # Verfügbare Fahrzeuge nach der Rückgabe prüfen
    print(f"Available after return: {len(agency.available_vehicles())}")

elif test_case == "rental_cost":
    # Teste Berechnung der Mietkosten
    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":
    # Teste Fahrzeug-Methoden
    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":
    # Teste Vererbungsbeziehungen
    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":
    # Teste polymorphes Verhalten
    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":
    # Teste Miet-Grenzfälle
    agency = RentalAgency("Edge Rentals")
    
    # Versuche, ein nicht existierendes Fahrzeug zu mieten
    print(f"Rent non-existent: {agency.rent_vehicle('X999', 'John Doe', 3)}")
    
    # Ein Auto hinzufügen und mieten
    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}")
    
    # Versuche, dasselbe Auto erneut zu mieten
    print(f"Rent unavailable car: {agency.rent_vehicle('C123', 'Jane Smith', 2)}")
    
    # Versuche, eine nicht existierende Vermietung zurückzugeben
    print(f"Return non-existent rental: {agency.return_vehicle('R999')}")
    
    # Die gültige Vermietung zurückgeben
    print(f"Return valid rental: {agency.return_vehicle(rental_id)}")
    
    # Versuche, dieselbe Vermietung erneut zurückzugeben
    print(f"Return completed rental: {agency.return_vehicle(rental_id)}")

elif test_case == "agency_operations":
    # Teste umfassende Agentur-Operationen
    agency = RentalAgency("Full Service Rentals")
    
    # 5 Fahrzeuge hinzufügen
    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())}")
    
    # 3 Fahrzeuge mieten
    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())}")
    
    # 2 Fahrzeuge zurückgeben
    agency.return_vehicle(rental_ids[0])
    agency.return_vehicle(rental_ids[1])
    
    print(f"Available after returns: {len(agency.available_vehicles())}")
    
    # Verfügbare Fahrzeuge ausgeben
    print("Available vehicles:")
    for v in agency.available_vehicles():
        print(f"  {v}")

elif test_case == "stress_test":
    # Stresstest mit vielen Fahrzeugen
    agency = RentalAgency("Stress Test Rentals")
    
    # 100 Fahrzeuge hinzufügen
    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)
    
    # 50 Fahrzeuge mieten
    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())}")
    
    # Alle Vermietungen zurückgeben
    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":
    # Teste mit ungültigen Eingaben
    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()}")

Alle Lektionen in Object Oriented Programming