Lektion 28 von 35Python
Python · Lektion 28 · 60 Minuten
Boss-Level: Die Bibliothek
Das lernst du
- Eine eigene Klasse mit mehreren Methoden entwerfen
- Fehler mit eigenen Ausnahmen melden
- Daten in einer Datei speichern und wieder laden
Der Boss der Fortgeschrittenen
In der Fortgeschrittenen-Stufe hast du gelernt, Fehler abzufangen, Dateien zu schreiben, eigene Klassen zu bauen und Code zu testen. Jetzt kommt alles zusammen: ein kleines Verwaltungsprogramm, wie es echte Bibliotheken benutzen.
Erinnerung: Ausnahmen selbst auslösen
Eine gute Klasse meldet Fehler laut, statt still das Falsche zu tun:
class Tresor:
def __init__(self, code):
self.code = code
self.offen = False
def oeffnen(self, versuch):
if versuch != self.code:
raise ValueError("Falscher Code!")
self.offen = True
t = Tresor(1234)
try:
t.oeffnen(1111)
except ValueError as fehler:
print("Abgefangen:", fehler)Erinnerung: Dateien schreiben
with open("liste.txt", "w") as datei:
for name, alter in [("Ana", 12), ("Ben", 13)]:
datei.write(f"{name};{alter}\n")
print(open("liste.txt").read())Strategie für den Boss
- Erst die Daten:
self.buecherist ein Dictionary Titel →True/False. Alles andere arbeitet damit. - Dann Methode für Methode: Teste jede sofort mit ein paar Zeilen unter der Klasse.
- Fehlerfälle zuletzt: Was passiert bei unbekannten oder schon verliehenen Büchern?
Weiterbauen: Eine Methode
laden(dateiname), die eine gespeicherte Datei wieder einliest – dann überlebt deine Bibliothek sogar das Programmende.
Deine Aufgabe
Jetzt bist du dran
Baue die Klasse Bibliothek. hinzufuegen(titel) nimmt ein Buch auf (verfügbar). ausleihen(titel) leiht es aus – unbekannte Titel lösen einen KeyError aus, schon verliehene einen ValueError. zurueckgeben(titel) macht es wieder verfügbar. verfuegbar() gibt eine sortierte Liste der verfügbaren Titel zurück. speichern(dateiname) schreibt pro Buch eine Zeile Titel;ja oder Titel;nein (verfügbar oder nicht).
class Bibliothek:
def __init__(self):
self.buecher = {} # Titel → True (verfügbar) oder False (verliehen)
def hinzufuegen(self, titel):
pass
def ausleihen(self, titel):
pass
def zurueckgeben(self, titel):
pass
def verfuegbar(self):
pass
def speichern(self, dateiname):
pass
bib = Bibliothek()
bib.hinzufuegen("Momo")
bib.hinzufuegen("Krabat")
bib.ausleihen("Momo")
print(bib.verfuegbar())- Denkanstoß
hinzufuegen setzt
self.buecher[titel]=True. verfuegbar sammelt alle Titel mitTrueund gibtsorted(...)zurück. - Welcher Befehl hilft?
Prüfe in ausleihen zuerst, ob der Titel überhaupt in
self.buechersteht (sonstraiseKeyError(titel)), dann ob er verfügbar ist (sonstraiseValueError(...)).Öffne die Datei mit
withopen(dateiname, "w")asdatei und schreib für jedes Buchf"{titel};ja"oderf"{titel};nein"plus Zeilenumbruch. - Lückencode – ergänze die ___
class Bibliothek: def __init__(self): self.buecher = {} # Titel → True (verfügbar) oder False (verliehen) def hinzufuegen(self, titel): self.buecher[titel] = ___ def ausleihen(self, titel): if ___: ___ if ___: ___ self.buecher[titel] = ___ def zurueckgeben(self, titel): self.buecher[titel] = ___ def verfuegbar(self): return ___ def speichern(self, dateiname): with ___ as datei: for titel, frei in ___: datei.write(___) bib = Bibliothek() bib.hinzufuegen("Momo") bib.hinzufuegen("Krabat") bib.ausleihen("Momo") print(bib.verfuegbar())
Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.
Lösung anzeigen🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:
class Bibliothek:
def __init__(self):
self.buecher = {} # Titel → True (verfügbar) oder False (verliehen)
def hinzufuegen(self, titel):
self.buecher[titel] = True
def ausleihen(self, titel):
if titel not in self.buecher:
raise KeyError(titel)
if not self.buecher[titel]:
raise ValueError(f"{titel} ist schon verliehen")
self.buecher[titel] = False
def zurueckgeben(self, titel):
self.buecher[titel] = True
def verfuegbar(self):
return sorted(titel for titel, frei in self.buecher.items() if frei)
def speichern(self, dateiname):
with open(dateiname, "w") as datei:
for titel, frei in self.buecher.items():
datei.write(f"{titel};{'ja' if frei else 'nein'}\n")
bib = Bibliothek()
bib.hinzufuegen("Momo")
bib.hinzufuegen("Krabat")
bib.ausleihen("Momo")
print(bib.verfuegbar())