处理未实现的行为

如果你的类没有为所提供的参数类型实现特定的重载运算符,那么它应该是 return NotImplemented注意这是一个特殊的常量 ,与 NotImplementedError 不同)。这将允许 Python 回退到尝试其他方法来使操作工作:

当返回 NotImplemented 时,解释器将尝试对另一种类型或其他一些后备的反射操作,具体取决于运算符。如果所有尝试的操作都返回 NotImplemented,则解释器将引发适当的异常。

例如,给定 x + y,如果 x.__add__(y) 返回未实现,则尝试使用 y.__radd__(x)

class NotAddable(object):

    def __init__(self, value):
        self.value = value

    def __add__(self, other):
        return NotImplemented

class Addable(NotAddable):

    def __add__(self, other):
        return Addable(self.value + other.value)

    __radd__ = __add__

由于这是反映的方法,我们必须实现 __add__ __radd__ 以在所有情况下获得预期的行为; 幸运的是,由于他们在这个简单的例子中做了同样的事情,我们可以采取捷径。

正在使用:

>>> x = NotAddable(1)
>>> y = Addable(2)
>>> x + x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'NotAddable' and 'NotAddable'
>>> y + y
<so.Addable object at 0x1095974d0>
>>> z = x + y
>>> z
<so.Addable object at 0x109597510>
>>> z.value
3