覆盖“”=” 在Python中? (__iadd__() 方法)
是否可以在Python中重写+=?
Is it possible to override += in Python?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
是否可以在Python中重写+=?
Is it possible to override += in Python?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
是的,覆盖
__iadd__
< /a> 方法。 例子:Yes, override the
__iadd__
method. Example:除了上面答案中正确给出的内容之外,值得明确澄清的是,当覆盖
__iadd__
时,x += y
操作不会以的结尾结束>__iadd__
方法。相反,它以 x = x.__iadd__(y) 结尾。 换句话说,Python 在实现完成后将
__iadd__
实现的返回值分配给您要“添加到”的对象。这意味着可以改变 x += y 操作的左侧,从而导致最终的隐式步骤失败。 考虑一下当您添加到列表中的内容时会发生什么:
>>> x[1] += y # x 有两个项目
现在,如果您的
__iadd__
实现(x[1]
处对象的方法)错误或故意从列表开头删除第一项 (x[0]
),然后 Python 将运行您的__iadd__
方法) & 尝试将其返回值分配给x[1]
。 它将不再存在(它将位于x[0]
),从而导致ÌndexError
。或者,如果您的
__iadd__
在上例的x
开头插入一些内容,您的对象将位于x[2]
,而不是x[1]
,之前位于x[0]
的内容现在将位于x[1]
并被赋予x[0]
的返回值code>__iadd__ 调用。除非人们了解正在发生的事情,否则所产生的错误可能会是一场难以修复的噩梦。
In addition to what's correctly given in answers above, it is worth explicitly clarifying that when
__iadd__
is overriden, thex += y
operation does NOT end with the end of__iadd__
method.Instead, it ends with
x = x.__iadd__(y)
. In other words, Python assigns the return value of your__iadd__
implementation to the object you're "adding to", AFTER the implementation completes.This means it is possible to mutate the left side of the
x += y
operation so that the final implicit step fails. Consider what can happen when you are adding to something that's within a list:>>> x[1] += y # x has two items
Now, if your
__iadd__
implementation (a method of an object atx[1]
) erroneously or on purpose removes the first item (x[0]
) from the beginning of the list, Python will then run your__iadd__
method) & try to assign its return value tox[1]
. Which will no longer exist (it will be atx[0]
), resulting in anÌndexError
.Or, if your
__iadd__
inserts something to beginning ofx
of the above example, your object will be atx[2]
, notx[1]
, and whatever was earlier atx[0]
will now be atx[1]
and be assigned the return value of the__iadd__
invocation.Unless one understands what's happening, resulting bugs can be a nightmare to fix.
除了重载
__iadd__
(记住返回 self!)之外,您还可以回退到__add__
,因为 x += y 的工作方式类似于 x = x + y。 (这是 += 运算符的陷阱之一。)它甚至 让专家困惑:
您期望
x.id
、y.id
和Resource 的值是什么.class_counter
有吗?In addition to overloading
__iadd__
(remember to return self!), you can also fallback on__add__
, as x += y will work like x = x + y. (This is one of the pitfalls of the += operator.)It even trips up experts:
What values do you expect
x.id
,y.id
, andResource.class_counter
to have?http://docs.python.org/reference/datamodel.html#emulated -数字类型
http://docs.python.org/reference/datamodel.html#emulating-numeric-types