Seite 1 von 1

__iadd__(self, other)

Verfasst: Montag 8. Februar 2010, 19:08
von lodder
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]

Re: __iadd__(self, other)

Verfasst: Montag 8. Februar 2010, 19:28
von cofi
lodder hat geschrieben:warum geht das nicht bei der __iadd__ genauso??
Weil `__iadd__` sich nich um die Addition sondern um die in-place Addition kuemmert, d.h. bei `a += 5` anspringt.

Re: __iadd__(self, other)

Verfasst: Montag 8. Februar 2010, 20:15
von bords0
cofi hat geschrieben:
lodder hat geschrieben:warum geht das nicht bei der __iadd__ genauso??
Weil `__iadd__` sich nich um die Addition sondern um die in-place Addition kuemmert, d.h. bei `a += 5` anspringt.
Doppelter Unsinn.

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]

Verfasst: Montag 8. Februar 2010, 20:48
von cofi
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.

Verfasst: Montag 8. Februar 2010, 22:12
von bords0
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!
cofi hat geschrieben:Dass `a += 5` == `a = a + 5` ist, ist bei int allerdings ein Sonderfall.
Das gilt bei immutablen Objekten immer, wenn man sich bei der implementation von __iadd__ an folgendes hält, was in der Doku steht:
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).
Bei mutablen Objekten kann es also vorkommen, dass es Unterschiede gibt; darauf verlassen sollte man sich nicht.

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?

Verfasst: Dienstag 9. Februar 2010, 08:25
von lodder
Ich mächte mich erst mal bedanken für die Antworten. Benutzen möchte ich das nicht. Woolte einfach mal wissen was damit genau gemeint ist.

Ihr habt mir aber geholfen. Danke