87 lines
2.6 KiB
Markdown
87 lines
2.6 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__`**!
|
|
|
|
---
|
|
|
|
## ✨ Die `__str__`-Methode
|
|
|
|
Wann immer Python ein Objekt in einen Text umwandeln soll (z.B. bei `print(mein_objekt)` oder `str(mein_objekt)` oder in einem f-String `f"Das Buch: {mein_objekt}"`), schaut Python nach, ob deine Klasse eine `__str__`-Methode hat.
|
|
|
|
Wenn ja, ruft Python sie automatisch auf:
|
|
|
|
```python
|
|
class Buch:
|
|
def __init__(self, titel, autor):
|
|
self.titel = titel
|
|
self.autor = autor
|
|
|
|
def __str__(self):
|
|
# Muss immer einen STRING zurückgeben (return)!
|
|
return f"'{self.titel}' von {self.autor}"
|
|
|
|
mein_buch = Buch("Harry Potter", "J.K. Rowling")
|
|
print(mein_buch) # Ausgabe: 'Harry Potter' von J.K. Rowling 🎉
|
|
```
|
|
|
|
---
|
|
|
|
## 🧺 Objekte in Listen verwalten
|
|
|
|
Oft hat man Objekte, die eine Liste von *anderen* Objekten verwalten (z.B. ein Warenkorb, der Artikel enthält, oder ein Bus, der Fahrgäste enthält):
|
|
|
|
```python
|
|
class Schultasche:
|
|
def __init__(self):
|
|
self.buecher = [] # Startet mit einer leeren Liste
|
|
|
|
def buch_einpacken(self, buch):
|
|
self.buecher.append(buch)
|
|
|
|
def inhalt_anzeigen(self):
|
|
for b in self.buecher:
|
|
print(f"- {b}") # Hier wird automatisch b.__str__() genutzt!
|
|
```
|
|
|
|
---
|
|
|
|
## ⚠️ 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
|
|
```
|