__iadd__(self, other)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

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]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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]
Benutzeravatar
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.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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?
lodder
User
Beiträge: 67
Registriert: Montag 11. Januar 2010, 11:03

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
Antworten