В дополнение к тому, что правильно указано в ответах выше, стоит явно уточнить, что когда __iadd__
переопределяется, операция x += y
НЕ заканчивается завершением метода __iadd__
.
Вместо этого он заканчивается x = x.__iadd__(y)
. Другими словами, Python присваивает возвращаемое значение вашей __iadd__
реализации объекту, к которому вы «добавляете», ПОСЛЕ того, как реализация завершается.
Это означает, что можно изменить левую часть операции x += y
, чтобы завершить неявный шаг. Подумайте, что может произойти, когда вы добавляете что-то в список:
>>> x[1] += y # x has two items
Теперь, если ваша реализация __iadd__
(метод объекта на x[1]
) ошибочно или намеренно удаляет первый элемент (x[0]
) из начала списка, Python запустит ваш __iadd__
метод) и попытайтесь присвоить его возвращаемое значение x[1]
. Который больше не будет существовать (это будет x[0]
), в результате ÌndexError
.
Или, если ваш __iadd__
вставит что-то в начало x
приведенного выше примера, ваш объект будет иметь значение x[2]
, а не x[1]
, а то, что раньше было x[0]
, теперь будет иметь значение x[1]
и ему будет присвоено возвращаемое значение вызова __iadd__
.
Если человек не понимает, что происходит, возникающие ошибки могут стать кошмаром для исправления.