【问题标题】:Override operator to handle none type覆盖运算符以处理无类型
【发布时间】:2019-03-13 11:30:26
【问题描述】:

我如何覆盖__iadd__ 以便它处理None

示例:

var = None
myObject = MyObject()
var += myObject
var == myObject
>> True

如果我只是在 myObject 中覆盖 __iadd__ 来处理将两个 MyObject 加在一起,我会收到此错误:

回溯(最近一次通话最后一次):
文件“”,第 1 行,在 类型错误:+= 不支持的操作数类型:'NoneType' 和 '我的对象'

【问题讨论】:

  • += 建议的var += myObjectvar = 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


【解决方案1】:

问题是如果 var=None,那么 __iadd__ 方法会在 None 上被调用,而不是在 MyObject 上

class myobject:
    def __iadd__(self, other):
        if other is None:
            return self
        else:
            pass # Do stuff here

这很好用:

var = myobject()
var += None

但这不会:

var = None
var += myobject()

处理它的最佳方法是捕获错误:

try:
    var += myobject()
except TypeError:
    var = myobject()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2018-04-12
    • 1970-01-01
    • 2011-05-31
    • 2012-07-09
    相关资源
    最近更新 更多