處理未實現的行為

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