处理未实现的行为
如果你的类没有为所提供的参数类型实现特定的重载运算符,那么它应该是 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