python
from dataclasses import dataclass
@dataclass
class Artikel:
name: str
preis: float
bestand: int = 0
class Lager:
def __init__(self):
self._artikel = {}
def hinzufuegen(self, artikel):
self._artikel[artikel.name] = artikel
def entnehmen(self, name, menge):
if name not in self._artikel:
raise ValueError(f'Unbekannter Artikel: {name}')
artikel = self._artikel[name]
if menge > artikel.bestand:
raise ValueError(f'Nur {artikel.bestand} Stück von {name} vorrätig')
artikel.bestand -= menge
@property
def gesamtwert(self):
return sum(a.preis * a.bestand for a in self._artikel.values())
lager = Lager()
lager.hinzufuegen(Artikel('Stift', 1.5, 100))
lager.hinzufuegen(Artikel('Heft', 3.0, 40))
lager.entnehmen('Stift', 10)
print(lager.gesamtwert) # 90 * 1.5 + 40 * 3.0 = 255.0
Was passiert:
Artikelbraucht als Dataclass keinen eigenen Konstruktor.Artikel('Stift', 1.5, 100)funktioniert sofort.Lagerhält die Artikel inself._artikel. Der Unterstrich zeigt: Das ist intern, Benutzer sollenhinzufuegenundentnehmennutzen.- Ein Dictionary mit dem Namen als Schlüssel macht die Suche schnell und einfach (
name not in self._artikel). entnehmenprüft zuerst alle Fehlerfälle und ändert den Bestand erst danach. So bleibt das Lager bei einem Fehler unverändert.gesamtwertist eine@property: Man schreibtlager.gesamtwertohne Klammern, der Wert wird bei jedem Zugriff frisch berechnet und kann nie veraltet sein.
Warum so: Die Klasse Lager versteckt, wie die Daten gespeichert sind. Du könntest später das Dictionary durch eine Datenbank ersetzen, und der restliche Code müsste sich nicht ändern.