I would like to subclass an immutable type or implement one of my own which behaves like an int
does as shown in the following console session:
class aug_int:
def __init__(self, value):
self.value = value
def __iadd__(self, other):
self.value += other
return self
>>> i = aug_int(34)
>>> i
<__main__.aug_int instance at 0x02368E68>
>>> i.value
34
>>> i += 55
>>> i
<__main__.aug_int instance at 0x02368E68>
>>> i.value
89
>>>
When it sees i += 1
, Python will try to call __iadd__
. If that fails, it'll try to call __add__
.
In both cases, the result of the call will be bound to the name, i.e. it'll attempt i = i.__iadd__(1)
and then i = i.__add__(1)
.
The return value of __iadd__()
is used. You don't need to return the object that's being added to; you can create a new one and return that instead. In fact, if the object is immutable, you have to.
import os.path
class Path(str):
def __iadd__(self, other):
return Path(os.path.join(str(self), str(other)))
path = Path("C:\\")
path += "windows"
print path
Simply don't implement __iadd__
, but only __add__
:
>>> class X(object):
... def __add__(self, o):
... return "added"
>>> x = X()
>>> x += 2
>>> x
'added'
If there's no x.__iadd__
, Python simply calculates x += y
as x = x + y
doc.