Aufgaben-Python/04_str_und_darstellung/README.md

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
```