處理未實現的行為
如果你的類沒有為所提供的引數型別實現特定的過載運算子,那麼它應該是 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