Есть ли способ перегрузить + = в Python?

Я знаю о методе __add__ для переопределения плюса, но когда я использую его для переопределения + =, у меня возникает одна из двух проблем:

(1) если __add__ мутирует себя, то

z = x + y

будет видоизменять x, когда я действительно не хочу, чтобы x там видоизменялся.

(2) если __add__ возвращает новый объект, то

tmp = z
z += x
z += y
tmp += w
return z

вернет что-то без w, поскольку z и tmp указывают на разные объекты после выполнения z += x.

Я могу сделать какой-то .append() метод, но я бы предпочел перегрузить +=, если это возможно.


person Josh Gibson    schedule 08.04.2009    source источник
comment
@tzot в каком-то смысле, вы смотрите на F'ing M. ;-)   -  person Bob Stein    schedule 02.04.2016
comment
Вы имеете в виду, что Джош является одним из авторов руководств по Python? Извините, я не понимаю, что вы имеете в виду, @ BobStein-VisiBone.   -  person tzot    schedule 03.04.2016
comment
@tzot Я имел в виду, что Stack Overflow по большей части является Руководством по Python. Найти эту страницу было проще, чем на docs.python.org. Особенно, если вы еще не знаете, как искать __iadd__ или термин «добавление на месте».   -  person Bob Stein    schedule 03.04.2016


Ответы (1)


да. Просто переопределите метод __iadd__ объекта, который принимает те же параметры, что и add. Дополнительную информацию можно найти здесь.

person mipadi    schedule 08.04.2009
comment
+1: Цитируйте документацию :-) - person S.Lott; 08.04.2009
comment
Должны ли типы совпадать? То есть, могу ли я + = два разных типа вместе, если захочу? Я продолжаю получать исключения, не уверен, что это из-за того, что я делаю это неправильно или потому, что это никогда не разрешается. Документы очень слабы по этому поводу. - person grego; 21.03.2020