Skip to content Skip to sidebar Skip to footer

How To Implement "__iadd__()" For An Immutable Type?

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: >>> i=42 >>> id(i)

Solution 1:

Simply don't implement __iadd__, but only __add__:

>>>classX(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.

Solution 2:

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).

Solution 3:

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"printpath

Solution 4:

classaug_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
>>>

Post a Comment for "How To Implement "__iadd__()" For An Immutable Type?"