90 lines
2.7 KiB
Markdown
90 lines
2.7 KiB
Markdown
# Kapitel 04: Schöne Ausgaben mit `__str__` 🧾
|
|
|
|
Hast du schon mal versucht, ein selbst erstelltes Objekt direkt mit `print()` auszugeben?
|
|
|
|
```python
|
|
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
|
|
|
|
```python
|
|
# 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__`
|
|
|
|
1. **`__str__` muss immer einen `str` zurückgeben (`return`), NIEMALS `print`:**
|
|
- ❌ `def __str__(self): print(self.name)` (Falsch!)
|
|
- ✅ `def __str__(self): return str(self.name)` (Richtig!)
|
|
2. **Unterstriche beachten:**
|
|
- Zwei Unterstriche vor und nach `str`: `__str__`.
|
|
|
|
---
|
|
|
|
## 🎯 Deine Aufgabe: Der Supermarkt-Kassenzettel
|
|
|
|
In `aufgabe.py` programmierst du zwei Klassen:
|
|
1. `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`).
|
|
2. `Warenkorb`: Verwaltet eine Liste von `Artikel`-Objekten.
|
|
- `artikel_hinzufuegen()`: Packt einen Artikel in den Warenkorb.
|
|
- `gesamtsumme()`: Berechnet die Gesamtsumme aller Artikel.
|
|
- `bon_text()`: Erzeugt einen formatierten mehrzeiligen Kassenbon.
|
|
|
|
### Testen:
|
|
```bash
|
|
python3 test_aufgabe.py
|
|
```
|