Fahrzeugvermietungsservice
Teil des Abschnitts Objektorientierte Programmierung der Python-Journey von Coddy. Lektion 64 von 64.
Aufgabe
MittelIn dieser Herausforderung implementierst du ein Fahrzeugverleihsystem. Das System modelliert Fahrzeuge, Vermietungen und eine Vermietungsagentur mit ordnungsgemäßer Vererbung und Kapselung.
vehicle.py– Implementiere die Basisklasse Vehiclecar.py– Implementiere die Unterklasse Carmotorcycle.py– Implementiere die Unterklasse Motorcyclerental.py– Implementiere die Klasse Rentalrentalagency.py– Implementiere die Klasse RentalAgency
Jede Datei enthält detaillierte TODO-Kommentare, die dich bei der Implementierung anleiten. Befolge diese Kommentare, um sicherzustellen, dass dein Code alle Anforderungen erfüllt.
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 Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktormethode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDie super()-FunktionMethodenüberschreibungMehrfachvererbungMethodenauflösungsreihenfolgeWiederholung – Mitarbeiterhierarchie7Spezielle Methoden
Einführung in magische MethodenOperatorüberladungMagische Methoden für ContainerRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungsservice2Dekoratoren
Einführung in DekoratorenProperty-DekoratorDekorator für statische MethodenDekorator für Klassenmethoden5Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypingAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische Methoden und KlassenmethodenKlassen-DekoratorenKontextmanager3Klassenattribute
Instanz- vs. KlassenvariablenProperty-DecoratorsPrivate AttributeWiederholung – Bankkontoverwaltung6Kapselung
Öffentliche, geschützte, private MemberZugriffsmodifikatorenInformationsverbergungProperty-Decorators – FortgeschrittenWiederholung – System zur Verwaltung von Studentendaten12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und BenutzerklassenAusleihsystemSuchfunktionAdministrationsoberflächeTests und IntegrationÜbe selbstständig: Online-Python-Compiler