通过浏览decimal.py,它使用NotImplemented了许多特殊方法.例如
class A(object):
def __lt__(self, a):
return NotImplemented
def __add__(self, a):
return NotImplemented
Run Code Online (Sandbox Code Playgroud)
未实现
可以由"富比较"特殊方法(
__eq__(),__lt__()和朋友)返回的特殊值,以指示未针对其他类型实现比较.
它没有谈论其他特殊方法,也没有描述行为.
它似乎是一个神奇的对象,如果从其他特殊方法返回引发TypeError,并在"丰富的比较"特殊方法什么也不做.
例如
print A() < A()
Run Code Online (Sandbox Code Playgroud)
打印True,但
print A() + 1
Run Code Online (Sandbox Code Playgroud)
加注TypeError,所以我很好奇发生了什么以及NotImplemented的用法/行为是什么.
Bra*_*lor 32
NotImplemented允许您指示两个给定操作数之间的比较尚未实现(而不是指示比较有效,但False两个操作数的产量).
对于对象x和y,首先
x.__op__(y)尝试.如果未实现或返回NotImplemented,y.__rop__(x)则尝试.如果这也未实现或返回NotImplemented,则引发TypeError异常.但请参阅以下异常:前一项的异常:如果左操作数是内置类型或新样式类的实例,并且右操作数是该类型或类的正确子类的实例并覆盖基类的
__rop__()方法,则右操作数的__rop__()方法在左操作数的__op__()方法之前尝试.这样做是为了使子类可以完全覆盖二元运算符.否则,左操作数的__op__()方法将始终接受右操作数:当期望给定类的实例时,该类的子类的实例始终是可接受的.
小智 6
它实际上有从返回时相同的含义__add__从__lt__,所不同的是Python的2.X试图对象放弃之前比较的其他方式.Python 3.x确实引发了TypeError.事实上,Python也可以尝试其他东西__add__,看看__radd__和(尽管我对它很模糊)__coerce__.
# 2.6
>>> class A(object):
... def __lt__(self, other):
... return NotImplemented
>>> A() < A()
True
# 3.1
>>> class A(object):
... def __lt__(self, other):
... return NotImplemented
>>> A() < A()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: A() < A()
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅订购比较(3.0 docs).