在the manual中说:
一般来说,
__lt__()
和__eq__()
就足够了,如果你想要的话 比较运算符的常规含义
但我看到了错误:
> 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__()
修复此问题,但意味着我不明白订购的最低要求是什么......
谢谢, 安德鲁
答案 0 :(得分:4)
Python 3.x永远不会对运算符进行任何类型强制,因此在此上下文中不使用__int__()
。比较
a < b
首先会尝试拨打type(a).__lt__(a, b)
,如果这会返回NotImplemented
,则会拨打type(b).__gt__(b, a)
。
文档中的引用是关于比较单个类型的工作,上面的解释说明了为什么这对单个类型来说已经足够了。
要使您的类型与int
正确交互,您应该实现所有比较运算符,或使用Python 2.7或3.2中提供的total_ordering
decorator。