在Python中有没有一种方法可以重载+=运算符?

58
我知道可以使用__add__方法重载加号,但当我用它来重载+=时,会遇到以下两个问题之一:
(1) 如果__add__改变了self,则:
z = x + y

我不希望 x 在那里被改变,但会发生变异。

(2) 如果 __add__ 返回一个新的对象,则

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

在执行z += x后,由于ztmp指向不同的对象,因此返回的内容将不包含w

我可以创建某种形式的.append()方法,但如果可能的话,我更愿意重载+=运算符。


4
以某种方式来看,你正在看 F'ing M。;-) - Bob Stein
你是在暗示Josh是Python手册的作者之一吗?抱歉,我好像不太明白你的意思,@BobStein-VisiBone。 - tzot
16
@tzot 我的意思是Stack Overflow在很大程度上是Python的手册。比起docs.python.org上的页面,找到这个页面更容易。特别是如果你不知道要搜索__iadd__或“in-place”加法这个术语的话。 - Bob Stein
1个回答

109

是的。只需覆盖对象的__iadd__方法,该方法与add具有相同的参数。您可以在这里找到更多信息。


3
+1:引用文档说明 :-) - S.Lott
类型必须匹配吗?也就是说,如果我想要,我可以将两种不同的类型 += 在一起吗?我一直收到异常,不确定是因为我做错了还是因为它从未被允许。文档在这方面非常薄弱。 - grego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接