&gt; No &quot;self mutation&quot; as you suggest.<p>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__.)<p>The only time you should actually override __iadd__ is for mutable objects, in which case it should look more like<p><pre><code>  class Vector2D:
      def __iadd__(self, other)
          for i, x in enumerate(other):
              self[i] += x
          return self
</code></pre>
That&#x27;s the self mutation I was talking about.<p>Well, strictly that&#x27;s not OK either, since operators shouldn&#x27;t be duck-typed. Instead you should do<p><pre><code>  class Vector2D:
      def __iadd__(self, other)
          if not isinstance(other, Vector2D):
              return NotImplemented

          for i, x in enumerate(other):
              self[i] += x
          return self</code></pre>