可以在Python中覆盖+ =吗?
发布于 2018-09-04 12:37:39
是的,覆盖__iadd__
方法。例:
def __iadd__(self, other):
self.number += other.number
return self
发布于 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__
调用的返回值。
除非人们理解正在发生的事情,否则产生的错误可能是一个噩梦。
https://stackoverflow.com/questions/-100002552
复制相似问题