I'm overloading the
self.stage_changes = 
def __iadd__(self, other):
Because the documentation says:
These methods [the
__i*__methods] are called to implement the augmented arithmetic assignments (+=, -=, *=, /=, //=, %=, **=, <<=, >>=, &=, ^=, |=). These methods should attempt to do the operation in-place (modifying self) and return the result (which could be, but does not have to be, self).
They don't have to return
self, but they do have to return the result, because that result is then assigned back to the target on the left side of the equals sign. In other words,
__iadd__(x, y) has to return the result of
x+y just like
__add__(x, y) has to return the result of
x+y. It's just
__iadd__ may, in addition mutate the left-hand operand if it wants to.
Or, as you'll no doubt see if you look for other questions about this,
x += y is not, as some people think, equivalent to
x.__iadd__(y). It is equivalent to
x = x.__iadd__(y).