您好我正在覆盖__cmp__
。如果传递的第二个对象是None
,或者它不是someClass
的实例,则返回-1
。
我不明白这里到底发生了什么。
class someClass():
def __cmp__(self, obj):
if obj == None:
return -1
if not isinstance(obj, someClass):
return -1
我的测试功能:
def test_function(self):
obj1 = someClass()
self.assertTrue(obj1 < None)
# I get true.
self.assertTrue(obj1 > None)
# I get failure as False is returned.
有人可以向我解释一下:
True
或False
?答案 0 :(得分:8)
__cmp__
的惯例是:
a < b : return -1
a = b : return 0
a > b : return 1
这当然只有在a
和b
兼容类型(例如数字)时才有意义。如果您有“极端情况”,其中a
或b
为无或不兼容(not instanceof
),则应报告错误,因为这是使用<{1}}实例上的比较运算符。
可以使用someClass
实现任何行为,但是按照OP描述的方式与None进行比较最终会导致奇怪的行为和错误。
另见:__lt__ instead of __cmp__
__cmp__
答案 1 :(得分:3)
当obj
为None
时,您的程序将返回-1,而返回负整数则表示self < obj
,因此obj1 < None
为True
,并且obj1 > None
为false
。
答案 2 :(得分:1)
如果您查看python documentation,您会看到cmp
函数返回-1
self < other
。
自__cmp__(obj, None) == -1
以来,它假定为obj < None
。
我猜如果__cmp__(obj, None)
应该返回1
,因为任何对象都优于无对象:)