Aufgaben-Python/10_vererbung_und_super/musterloesung.py

168 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Kapitel 10: Vererbung & super() – Musterlösung 🧬🚗
===================================================
Schulabgleich: 25.0 Vererbung
"""
from typing import List, Optional
class Fahrzeug:
"""Basisklasse für alle Fahrzeuge."""
def __init__(self, marke: str, modell: str, baujahr: int, grundpreis: float):
self.marke: str = marke
self.modell: str = modell
self.baujahr: int = int(baujahr)
self.grundpreis: float = float(grundpreis)
self.kilometerstand: float = 0.0
def fahren(self, km: float) -> None:
if km > 0:
self.kilometerstand += float(km)
def berechne_restwert(self, aktuelles_jahr: int) -> float:
alter = max(0, aktuelles_jahr - self.baujahr)
wertverlust = self.grundpreis * 0.05 * alter
restwert = self.grundpreis - wertverlust
return max(self.grundpreis * 0.10, restwert)
def info(self) -> str:
return f"{self.marke} {self.modell} ({self.baujahr}) - {self.kilometerstand:.1f} km"
def __str__(self) -> str:
return self.info()
class Auto(Fahrzeug):
"""Abgeleitete Klasse für PKWs (erbt von Fahrzeug)."""
def __init__(
self,
marke: str,
modell: str,
baujahr: int,
grundpreis: float,
sitzplaetze: int = 5,
anzahl_tueren: int = 5,
):
super().__init__(marke, modell, baujahr, grundpreis)
self.sitzplaetze: int = int(sitzplaetze)
self.anzahl_tueren: int = int(anzahl_tueren)
def hupen(self) -> str:
return f"Hup hup! Platz da für den {self.marke} {self.modell}!"
def info(self) -> str:
return f"{super().info()} | {self.sitzplaetze} Sitze, {self.anzahl_tueren} Türen"
class ElektroAuto(Auto):
"""Abgeleitete Klasse für Elektroautos (erbt von Auto)."""
def __init__(
self,
marke: str,
modell: str,
baujahr: int,
grundpreis: float,
batterie_kapazitaet_kwh: float,
sitzplaetze: int = 5,
anzahl_tueren: int = 5,
verbrauch_pro_100km: float = 18.0,
):
super().__init__(marke, modell, baujahr, grundpreis, sitzplaetze, anzahl_tueren)
self.batterie_kapazitaet_kwh: float = float(batterie_kapazitaet_kwh)
self.batterie_ladestand_kwh: float = float(batterie_kapazitaet_kwh)
self.verbrauch_pro_100km: float = float(verbrauch_pro_100km)
def reichweite(self) -> float:
if self.verbrauch_pro_100km <= 0:
return 0.0
return (self.batterie_ladestand_kwh / self.verbrauch_pro_100km) * 100.0
def fahren(self, km: float) -> bool:
if km <= 0:
return False
benoetigt = (km / 100.0) * self.verbrauch_pro_100km
if self.batterie_ladestand_kwh >= benoetigt:
self.batterie_ladestand_kwh -= benoetigt
super().fahren(km)
return True
return False
def aufladen(self, kwh: float) -> float:
if kwh <= 0:
return 0.0
freier_platz = self.batterie_kapazitaet_kwh - self.batterie_ladestand_kwh
tatsaechlich = min(freier_platz, float(kwh))
self.batterie_ladestand_kwh += tatsaechlich
return tatsaechlich
def info(self) -> str:
return (
f"{super().info()} | Akku: {self.batterie_ladestand_kwh:.1f}/"
f"{self.batterie_kapazitaet_kwh:.1f} kWh ({self.reichweite():.1f} km Reichweite)"
)
class Lkw(Fahrzeug):
"""Abgeleitete Klasse für Lastkraftwagen (erbt von Fahrzeug)."""
def __init__(
self,
marke: str,
modell: str,
baujahr: int,
grundpreis: float,
max_zuladung_kg: float,
):
super().__init__(marke, modell, baujahr, grundpreis)
self.max_zuladung_kg: float = float(max_zuladung_kg)
self.aktuelle_ladung_kg: float = 0.0
def beladen(self, kg: float) -> bool:
if kg > 0 and (self.aktuelle_ladung_kg + kg <= self.max_zuladung_kg):
self.aktuelle_ladung_kg += float(kg)
return True
return False
def entladen(self, kg: float) -> float:
if kg <= 0:
return 0.0
tatsaechlich = min(self.aktuelle_ladung_kg, float(kg))
self.aktuelle_ladung_kg -= tatsaechlich
return tatsaechlich
def info(self) -> str:
return f"{super().info()} | Ladung: {self.aktuelle_ladung_kg:.1f}/{self.max_zuladung_kg:.1f} kg"
if __name__ == "__main__":
print("--- 🚗 Auto testen ---")
golf = Auto("VW", "Golf 8", 2021, 28000.0, sitzplaetze=5, anzahl_tueren=5)
golf.fahren(150.0)
print(golf.info())
print(golf.hupen())
print(f"Restwert im Jahr 2026: {golf.berechne_restwert(2026):.2f} €")
print("\n--- ⚡ ElektroAuto testen ---")
tesla = ElektroAuto("Tesla", "Model Y", 2023, 45000.0, batterie_kapazitaet_kwh=75.0, verbrauch_pro_100km=16.5)
print(tesla.info())
print(f"Start-Reichweite: {tesla.reichweite():.1f} km")
erfolg = tesla.fahren(200.0)
print(f"Fahrt 200 km erfolgreich? {erfolg}")
print(tesla.info())
geladen = tesla.aufladen(50.0)
print(f"Aufgeladen: {geladen:.1f} kWh")
print(tesla.info())
print("\n--- 🚛 LKW testen ---")
lkw = Lkw("Mercedes-Benz", "Actros", 2020, 110000.0, max_zuladung_kg=24000.0)
lkw.beladen(15000.0)
lkw.fahren(400.0)
print(lkw.info())
entladen = lkw.entladen(5000.0)
print(f"Entladen: {entladen:.1f} kg -> Neue Ladung: {lkw.aktuelle_ladung_kg:.1f} kg")