Hallo zusammen
Ich bin gerade am lesen eines Buches über Python und bin da auf die Magic Method "__iadd__(self,other)" gestoßen. Wollte die einfache Methode mal ausprobieren, aber leider ohne Erfolg. Kann mir jemand mal ein Beispiel geben wie ich z.B. a=a+5 berechne. für a z.B. 10 einsetzen
Habe es mit der "__add__(self, other)" probiert, da ging das ohne Probleme
(1).__add__(2)
warum geht das nicht bei der __iadd__ genauso??
[/code]
__iadd__(self, other)
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Weil `__iadd__` sich nich um die Addition sondern um die in-place Addition kuemmert, d.h. bei `a += 5` anspringt.lodder hat geschrieben:warum geht das nicht bei der __iadd__ genauso??
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Doppelter Unsinn.cofi hat geschrieben:Weil `__iadd__` sich nich um die Addition sondern um die in-place Addition kuemmert, d.h. bei `a += 5` anspringt.lodder hat geschrieben:warum geht das nicht bei der __iadd__ genauso??
1. int hat keine __iadd__-Methode, deshalb springt bei a += 5 die normale __add__-Methode an.
2. Man kann __iadd__ genauso aufrufen (bei Objekten, wo es die gibt, z.B. Listen), wie es der OP probiert hat:
Code: Alles auswählen
*** Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32. ***
>>> [1, 2].__iadd__([3, 4])
[1, 2, 3, 4]
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Ok ich habe wohl den int Bezug ueberlesen, es ist allerdings kein "doppelter Unsinn" sondern beantwortet nicht direkt, was der OP will. Dass `a += 5` == `a = a + 5` ist, ist bei int allerdings ein Sonderfall.
@OP warum willst du die Methoden denn nutzen? Die sind dazu gedacht, Operatoren (und aehnliche Konstrukte) fuer die eigenen Typen zu nutzen.
@OP warum willst du die Methoden denn nutzen? Die sind dazu gedacht, Operatoren (und aehnliche Konstrukte) fuer die eigenen Typen zu nutzen.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Das "Weil" ist Unsinn - man kann problemlos das Attribut __iadd__ aufrufen. Dass man es auch mit "+=" bekommt, verhindert das keineswegs Damit der falsche Eindruck nicht beim unbedarften Leser hängenbleibt, habe ich drastische Worte gewählt... nicht persönlich nehmen, bitte!
Weitere Unterschiede gibt es, wenn statt a ein komplizierterer Ausdruck dasteht (z.B. Attribut oder Indizierung), aber da dürfte es gar nicht so leicht sein, ein unterschiedliches Verhalten (abgesehen von Laufzeitunterschieden) herauszukitzeln. Ich wäre gespannt auf Beispiele - hat jemand eines parat?
Das gilt bei immutablen Objekten immer, wenn man sich bei der implementation von __iadd__ an folgendes hält, was in der Doku steht:cofi hat geschrieben:Dass `a += 5` == `a = a + 5` ist, ist bei int allerdings ein Sonderfall.
Bei mutablen Objekten kann es also vorkommen, dass es Unterschiede gibt; darauf verlassen sollte man sich nicht.These methods should attempt to do the operation in-place (modifying self) and return the result (which could be, but does not have to be, self).
Weitere Unterschiede gibt es, wenn statt a ein komplizierterer Ausdruck dasteht (z.B. Attribut oder Indizierung), aber da dürfte es gar nicht so leicht sein, ein unterschiedliches Verhalten (abgesehen von Laufzeitunterschieden) herauszukitzeln. Ich wäre gespannt auf Beispiele - hat jemand eines parat?