1. Was bedeutet "Dunder" & Operator Overloading?
+ +
+ In Python steht "Dunder" kurz für Double Underscore (doppelter Unterstrich), wie bei __init__ oder __str__.
+ Man nennt sie auch magische Methoden (Magic Methods) oder spezielle Methoden.
+
a + b, dann weiß Python von Natur aus nicht, was deine eigenen Klassen bedeuten.
+ Python ruft stattdessen heimlich im Hintergrund die Methode a.__add__(b) auf!+ Operator Overloading bedeutet einfach: Du schreibst die Methode
__add__ in deine Klasse, und schon funktioniert das Plus-Zeichen + für deine Objekte!
+ # Was du im Code schreibst: +ergebnis = v1 + v2 +ist_gleich = (v1 == v2) +laenge = len(meine_liste) + +# Was Python intern daraus macht: +ergebnis = v1.__add__(v2) +ist_gleich = v1.__eq__(v2) +laenge = meine_liste.__len__()+
2. Die wichtigste Dunder-Methoden-Tabelle
+ +Hier sind die am häufigsten genutzten magischen Methoden in Python:
+ +| Kategorie | +Operator / Funktion | +Dunder-Methode | +Bedeutung | +
|---|---|---|---|
| Mathematik | +a + b |
+ __add__(self, other) |
+ Addition | +
a - b |
+ __sub__(self, other) |
+ Subtraktion | +|
a * b |
+ __mul__(self, other) |
+ Multiplikation (von links) | +|
b * a |
+ __rmul__(self, other) |
+ Rechts-Multiplikation (z.B. 3 * v) |
+ |
| Vergleiche | +a == b |
+ __eq__(self, other) |
+ Gleichheit (Equal) | +
a < b |
+ __lt__(self, other) |
+ Kleiner als (Less Than) | +|
a <= b |
+ __le__(self, other) |
+ Kleiner gleich (Less or Equal) | +|
| Darstellung & Container | +print(a) / str(a) |
+ __str__(self) |
+ Schöne Ausgabe für Menschen | +
repr(a) |
+ __repr__(self) |
+ Eindeutige Debug-Ausgabe | +|
abs(a) |
+ __abs__(self) |
+ Betrag / Länge | +|
len(a) |
+ __len__(self) |
+ Anzahl von Elementen | +
__str__ und __repr__:-
+
__str__ist für Endbenutzer gedacht. Beispiel:(3.0, 4.0).
+ __repr__ist für Entwickler & Debugger gedacht. Sie soll so präzise sein, dass man das Objekt idealerweise wieder nachbauen könnte:Vektor2D(3.0, 4.0).
+
3. Praxisbeispiel: Der 2D-Vektor 🚀
+ ++ In Videospielen, Physiksimulationen und in der Geometrie rechnet man ständig mit 2D-Vektoren. + Mit Dunder-Methoden liest sich dein Code wie echte Mathematik! +
+ +class Vektor2D: + def __init__(self, x: float, y: float): + self.x = float(x) + self.y = float(y) + + def __add__(self, other: 'Vektor2D') -> 'Vektor2D': + if isinstance(other, Vektor2D): + return Vektor2D(self.x + other.x, self.y + other.y) + return NotImplemented + + def __mul__(self, other): + # Skalarmultiplikation mit Zahl: v * 3 + if isinstance(other, (int, float)): + return Vektor2D(self.x * other, self.y * other) + # Skalarprodukt mit anderem Vektor: v1 * v2 + elif isinstance(other, Vektor2D): + return self.x * other.x + self.y * other.y + return NotImplemented + + def __rmul__(self, other): + # Ermöglicht: 3 * v (Zahl steht links) + return self.__mul__(other)+
4. 🎯 Deine Aufgaben in aufgabe.py
+
+ Öffne die Datei 08_operator_overloading_dunder/aufgabe.py und vervollständige die folgenden Klassen:
-
+
- + + + +
- + + + +
- + + + +
- + + + +
- + + + +
- + + + +
- + + + +
💡 Lösungshinweise (Aufklappen bei Bedarf)
+ +🔍 Tipp zu TODO 3 (Länge berechnen mit math.sqrt)
+import math + +def laenge(self) -> float: + return math.sqrt(self.x**2 + self.y**2) + +def __abs__(self) -> float: + return self.laenge()+
🔍 Tipp zu TODO 9 (Gesamtlänge der Wegstrecke berechnen)
+Iteriere über alle Punkte von 0 bis len(self.punkte) - 2. Die Distanz zwischen zwei Punkten ist einfach abs(self.punkte[i+1] - self.punkte[i])!
5. 🧪 Lösung überprüfen
+Führe im Terminal im Ordner 08_operator_overloading_dunder folgenden Befehl aus:
python3 test_aufgabe.py
+