在the manual是說:最小方法在Python鴨打字訂購3.1
in general,
__lt__()
and__eq__()
are sufficient, if you want the conventional meanings of the comparison operators
但我看到的錯誤:
> assert 2 < three
E TypeError: unorderable types: int() < IntVar()
當我運行這個測試:
from unittest import TestCase
class IntVar(object):
def __init__(self, value=None):
if value is not None: value = int(value)
self.value = value
def __int__(self):
return self.value
def __lt__(self, other):
return self.value < other
def __eq__(self, other):
return self.value == other
def __hash__(self):
return hash(self.value)
class DynamicTest(TestCase):
def test_lt(self):
three = IntVar(3)
assert three < 4
assert 2 < three
assert 3 == three
我很驚訝,當IntVar()
在右邊,__int__()
沒有被調用。我究竟做錯了什麼?
添加__gt__()
修復了這個,而是指我不明白的最低要求是訂購...
感謝, 安德魯
如果你看[豐富比較方法文檔](http://docs.python.org/release/3.1.3/reference/datamodel.html#object.__lt__),它特別提到了這種行爲 - 'There沒有這些方法的交換參數版本(當左邊的參數不支持這個操作,但是正確的參數的時候使用);相反,__lt __()和__gt __()是彼此的反射,__le __()和__ge __()是彼此的反射,__eq __()和__ne __()是他們自己的反射。 豐富的比較方法的參數從未被強制。# – agf 2012-04-07 13:45:17
@agf:答案應該在答案中,而不是在評論中。 – 2012-04-07 15:56:36
@EthanFurman雖然Sven的回答確實如此,但文檔並沒有引導你,而IMO則認爲這不僅僅是一個評論,而是一個回答。 – agf 2012-04-07 16:46:02