Во-первых, вам нужно понять разницу между __add__
и __iadd__
.
Метод __add__
объекта является обычным дополнением: он принимает два параметра, возвращает их сумму и не изменяет ни один из параметров.
Метод __iadd__
объекта также принимает два параметра, но вносит изменения на месте, изменяя содержимое первого параметра. Поскольку для этого требуется мутация объекта, неизменяемые типы (например, стандартные числовые типы) не должны иметь метод __iadd__
.
a + b
использует __add__
. a += b
использует __iadd__
, если он существует; если это не так, он эмулирует это через __add__
, как в tmp = a + b; a = tmp
. operator.add
и operator.iadd
отличаются одинаково.
На другой вопрос: operator.iadd(x, y)
не эквивалентен z = x; z += y
, потому что если __iadd__
не существует, вместо него будет использоваться __add__
. Вам необходимо присвоить значение, чтобы гарантировать, что результат сохраняется в обоих случаях: x = operator.iadd(x, y)
.
Вы сами можете это легко увидеть:
import operator
a = 1
operator.iadd(a, 2)
# a is still 1, because ints don't have __iadd__; iadd returned 3
b = ['a']
operator.iadd(b, ['b'])
# lists do have __iadd__, so b is now ['a', 'b']