Seite 1 von 1
Unterschied operator.add / operator.iadd
Verfasst: Freitag 26. August 2011, 15:16
von mutetella
Hallo,
mir erschließt sich der Unterschied nicht ganz:
Code: Alles auswählen
>>> a = 5
>>> operator.add(a,1)
6
>>> a
5
>>> operator.iadd(a,1)
6
>>> a
5
Bei 'operator.iadd' spricht die Doku doch von einem 'in-place' operator. Ich würde also folgendes erwarten:
Was macht 'iadd' also anderes als 'add'?
mutetella
Re: Unterschied operator.add / operator.iadd
Verfasst: Freitag 26. August 2011, 15:52
von pillmuncher
guckstu:
Code: Alles auswählen
class Foo(object):
def __init__(self, val):
self._val = val
def __str__(self):
return 'Foo(%d)' % self._val
def __add__(self, number):
return Foo(self._val + number)
def __iadd__(self, number):
self._val += number
return self
from operator import add, iadd
a = Foo(2)
print add(a, 7)
print a
print iadd(a, 7)
print a
Ergebnis:
Nicht vergessen: ints sind immutable, Foos mutable.
Gruß,
Mick.
Re: Unterschied operator.add / operator.iadd
Verfasst: Freitag 26. August 2011, 19:25
von mutetella
@pillmuncher:
Danke für das Beispiel...
Das heißt aber auch, dass 'iadd' nur dann "in place" arbeitet, wenn das Objekt auch eine '__iadd__'-Methode besitzt.
'operator.add/operator.iadd' macht also letztlich nichts anderes, als 'object.__add__/object.__iadd__' aufzurufen.
Sehe ich das richtig?
mutetella
Re: Unterschied operator.add / operator.iadd
Verfasst: Freitag 26. August 2011, 19:34
von EyDu
Das hast du im Prinzip richtig verstanden. `operator.add` entspricht dem Aufruf von `+`, `operator.iadd` hingegen `+=`. Was genau passiert ist dann natürlich von den entsprechenden Objekten abhängig.