Dies ist eine alte Version des Dokuments!
LU02.A09 - Immutable Dataclass
Implementieren Sie eine Funktion, die eine neue Instanz einer Dataclass erstellt, anstatt die Originalinstanz zu verändern, und nutzen Sie dabei die Prinzipien der funktionalen Programmierung.
Aufgabenstellung
- Definieren Sie eine `@dataclass(frozen=True)` namens
Carmit den Attributenbrand(str),mileage(int) undservice_dates(List[str]). - Implementieren Sie eine Funktion
add_mileage(car: Car, distance: int) → Car, die eine neue Instanz der DataclassCarerstellt, mit einer aktualisiertenmileageund einer neuen Service-Datum, wenn die Laufleistung über 10.000 km steigt.- Die neue Instanz soll das aktualisierte Datum in der Liste
service_datesspeichern. Das Datum kann dabei ein fester Wert wie2024-08-28sein (für Testzwecke).
- Implementieren Sie eine zweite Funktion
check_service(car: Car) → bool, die prüft, ob die Laufleistung über 10.000 km liegt und entsprechendTrueoderFalsezurückgibt. - Nutzen Sie die Funktionen, um mehrere Änderungen an einer Instanz von
Cardurchzuführen, und drucken Sie die Liste der Service-Daten am Ende aus.
Code Vorlage
from dataclasses import dataclass, field from typing import List @dataclass(frozen=True) class Car: brand: str mileage: int service_dates: List[str] = field(default_factory=list) def add_mileage(car: Car, distance: int) -> Car: """ Returns a new Car instance with updated mileage and possibly an updated service date. """ new_mileage = car.mileage + distance new_service_dates = car.service_dates[:] if new_mileage > 10000 and (car.mileage <= 10000): new_service_dates.append('2024-08-28') return Car(brand=car.brand, mileage=new_mileage, service_dates=new_service_dates) def check_service(car: Car) -> bool: """ Checks if the car's mileage exceeds 10,000 km. """ return car.mileage > 10000 if __name__ == '__main__': my_car = Car(brand='Toyota', mileage=9500) print(f'Vor der Fahrt: {my_car}') my_car = add_mileage(my_car, 600) # Sollte den Service hinzufügen print(f'Nach der ersten Fahrt: {my_car}') if check_service(my_car): print('Service benötigt!') my_car = add_mileage(my_car, 100) # Keine Änderung bei Service-Daten print(f'Nach der zweiten Fahrt: {my_car}') print(f'Service-Daten: {my_car.service_dates}')
Schritt für Schritt
- Definieren Sie die immutable Dataclass
Carmit den benötigten Attributen. - Implementieren Sie die Funktion
add_mileage, die eine neue Instanz zurückgibt, wenn die Laufleistung aktualisiert wird und fügt gegebenenfalls ein Service-Datum hinzu. - Implementieren Sie die Funktion
check_service, die die Laufleistung überprüft. - Führen Sie mehrere Funktionsaufrufe durch, um die Änderungen zu testen und die Liste der Service-Daten zu überprüfen.