manually the __iadd__ methodthoughallows for more efficient in-place changes to be coded where applicableclass numberdef __init__(selfval)self val val def __iadd__(selfother)self val +other return self __iadd__ explicitx + usually returns self number( + + val for mutable objectsthis method can often specialize for quicker in-place changesy number([ ] +[ +[ val [ in-place change faster than the normal __add__ method is run as fallbackbut may not be able optimize in-place casesclass numberdef __init__(selfval)self val val def __add__(selfother)return number(self val otherx number( + + val __add__ fallbackx ( ypropagates class type and +does concatenation here though we've focused on herekeep in mind that every binary operator has similar right-side and in-place overloading methods that work the same ( __mul____rmul__and __imul__stillright-side methods are an advanced topic and tend to be fairly uncommon in practiceyou only code them when you need operators to be commutativeand then only if you need to support such operators at all for instancea vector class may use these toolsbut an employee or button class probably would not call expressions__call__ on to our next overloading methodthe __call__ method is called when your instance is called nothis isn' circular definition--if definedpython runs __call__ method for function call expressions applied to your instancespassing along whatever posicall expressions__call__