首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >覆盖Python中的“+ =”?(__iadd __()方法)

覆盖Python中的“+ =”?(__iadd __()方法)
EN

Stack Overflow用户
提问于 2018-09-04 04:05:13
回答 2查看 0关注 0票数 0

可以在Python中覆盖+ =吗?

EN

回答 2

Stack Overflow用户

发布于 2018-09-04 12:37:39

是的,覆盖__iadd__方法。例:

代码语言:javascript
复制
def __iadd__(self, other):
    self.number += other.number
    return self    
票数 0
EN

Stack Overflow用户

发布于 2018-09-04 13:21:18

除了上面的答案中正确给出的内容之外,值得明确说明当__iadd__覆盖时,x += y操作不会以__iadd__方法结束而结束。

相反,它结束于x = x.__iadd__(y)。换句话说,Python __iadd__在实现完成后将实现的返回值分配给您“添加到”的对象。

这意味着可以改变操作的左侧,x += y以便最后的隐式步骤失败。考虑当您添加到列表中的内容时会发生什么:

>>> x[1] += y # x has two items

现在,如果你的__iadd__实现(一个对象的方法x[1])错误地或有意地x[0]从列表的开头删除了第一个item(),那么Python将运行你的__iadd__方法)并尝试将其返回值赋值给x[1]。哪个将不再存在(它将在x[0]),从而产生一个ÌndexError

或者,如果您在上面的示例的__iadd__开头插入了某些内容,那么您x的对象将处于x[2],而不是x[1]之前的任何内容,并且x[0]x[1]被赋予__iadd__调用的返回值。

除非人们理解正在发生的事情,否则产生的错误可能是一个噩梦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档