【发布时间】:2019-03-13 11:30:26
【问题描述】:
我如何覆盖__iadd__ 以便它处理None?
示例:
var = None
myObject = MyObject()
var += myObject
var == myObject
>> True
如果我只是在 myObject 中覆盖 __iadd__ 来处理将两个 MyObject 加在一起,我会收到此错误:
回溯(最近一次通话最后一次):
文件“”,第 1 行,在 类型错误:+= 不支持的操作数类型:'NoneType' 和 '我的对象'
【问题讨论】:
-
+=建议的var += myObject和var = var + myObject之间的等价性并不是绝对的。+=不能使var引用一个新对象。尽管有其外观,+=不是赋值运算符。 -
@chepner 什么?您能否详细说明一下,在我使用过的每种语言中,不可变对象都被处理为 (var += myObject) == (var = var + myObject)。
-
我措辞不好(并且忽略了实际分配);
x += y等价于x = x + y如果__iadd__未定义;否则,它相当于x = x.__iadd__(y)。真正的问题是None根本没有__iadd__方法,而且你不能添加一个。
标签: python python-3.x operator-overloading