Earlier quoted context omitted.
> No "self mutation" as you suggest. Your example would be the implementation for immutable Vector2Ds, and is implemented for you if you just wrote __add__. (I presume object.__iadd__ falls back to self.__add__.) The only time you should actually override __iadd__ is for mutable objects, in which case it should look more like class Vector2D: def __iadd__(self, other) for i, x in enumerate(other): self[i] += x return…
> The only time you should actually override __iadd__ is for mutable objects What would the rationale be for such a rule? the docs don't mention anything like that https://docs.python.org/2/library/operator.html and I've never heard it before. In Python, neither integers nor strings are mutable and both support the "x += y" syntax. The __iadd__ method works the same for both mutable and immutable objects AFAIK
Because __iadd__ automatically delegates to __add__. For immutable objects that's the best you can do, so there's no reason to write both.