| .. | ||
| aufgabe.py | ||
| index.html | ||
| musterloesung.py | ||
| README.md | ||
| test_aufgabe.py | ||
Kapitel 04: Schöne Ausgaben mit __str__ 🧾
Hast du schon mal versucht, ein selbst erstelltes Objekt direkt mit print() auszugeben?
class Buch:
def __init__(self, titel, autor):
self.titel = titel
self.autor = autor
mein_buch = Buch("Harry Potter", "J.K. Rowling")
print(mein_buch)
Die Ausgabe sieht dann so aus:
<__main__.Buch object at 0x7fa2b0485d90>
Das ist kryptisch und hilft im Alltag nicht weiter. Aber Python hat dafür eine geniale Dunder-Methode: __str__!
🍕 Vollständiges Praxisbeispiel: Pizza & Pizzeria-Bestellung
# 1. Klasse Pizza mit __str__:
class Pizza:
def __init__(self, name, preis, extra_kaese=False):
self.name = name
self.preis = preis
self.extra_kaese = extra_kaese
if extra_kaese:
self.preis += 1.50
def __str__(self):
kaese = " (mit Extra-Käse)" if self.extra_kaese else ""
return f"Pizza {self.name}{kaese} - {self.preis:.2f} €"
# 2. Klasse Bestellung verwaltet Pizza-Objekte:
class Bestellung:
def __init__(self, kunden_name):
self.kunden_name = kunden_name
self.pizzen = []
def pizza_hinzufuegen(self, pizza):
self.pizzen.append(pizza)
def gesamtpreis(self):
return sum(p.preis for p in self.pizzen)
def rechnung_drucken(self):
zeilen = [f"=== RECHNUNG FÜR {self.kunden_name} ==="]
for p in self.pizzen:
zeilen.append(f"- {p}") # Ruft p.__str__() auf!
zeilen.append(f"Gesamt: {self.gesamtpreis():.2f} €")
return "\n".join(zeilen)
# Testen:
bestellung = Bestellung("Lisa")
bestellung.pizza_hinzufuegen(Pizza("Margherita", 8.50))
bestellung.pizza_hinzufuegen(Pizza("Salami", 9.50, extra_kaese=True))
print(bestellung.rechnung_drucken())
⚠️ Stolperfallen bei __str__
__str__muss immer einenstrzurückgeben (return), NIEMALSprint:- ❌
def __str__(self): print(self.name)(Falsch!) - ✅
def __str__(self): return str(self.name)(Richtig!)
- ❌
- Unterstriche beachten:
- Zwei Unterstriche vor und nach
str:__str__.
- Zwei Unterstriche vor und nach
🎯 Deine Aufgabe: Der Supermarkt-Kassenzettel
In aufgabe.py programmierst du zwei Klassen:
Artikel: Ein Produkt mit Name, Einzelpreis und Anzahl.__str__: Erzeugt einen Kassenbon-Text wie"3x Apfel (je 0.50 €) = 1.50 €".gesamtpreis(): Berechnet den Preis für diesen Artikel (preis * anzahl).
Warenkorb: Verwaltet eine Liste vonArtikel-Objekten.artikel_hinzufuegen(): Packt einen Artikel in den Warenkorb.gesamtsumme(): Berechnet die Gesamtsumme aller Artikel.bon_text(): Erzeugt einen formatierten mehrzeiligen Kassenbon.
Testen:
python3 test_aufgabe.py