pythonimmutabilityaugmented-assignment

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)
10021708
>>> i.__iadd__(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__iadd__'
>>> i += 1
>>> i
43
>>> id(i)
10021696

Not surprisingly, int objects have no __iadd__() method, yet applying += to one doesn't result in an error, instead it apparently creates a new int and also somehow magically reassigns it to the name given in the augmented assignment statement.

Is it possible to create a user-defined class or subclass of a built-in immutable one that does this, and if so, how?


Solution

  • 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