重写__cmp__ python函数

时间:2012-10-16 06:45:32

标签: python

您好我正在覆盖__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.

有人可以向我解释一下:

  • 什么是返回值?
  • 当比较标志发生变化时,如何决定是否会返回TrueFalse

3 个答案:

答案 0 :(得分:8)

__cmp__的惯例是:

a < b : return -1
a = b : return 0
a > b : return 1

这当然只有在ab兼容类型(例如数字)时才有意义。如果您有“极端情况”,其中ab为无或不兼容(not instanceof),则应报告错误,因为这是使用<{1}}实例上的比较运算符。

可以使用someClass实现任何行为,但是按照OP描述的方式与None进行比较最终会导致奇怪的行为和错误。

另见:__lt__ instead of __cmp__ __cmp__

答案 1 :(得分:3)

objNone时,您的程序将返回-1,而返回负整数则表示self < obj,因此obj1 < NoneTrue,并且obj1 > Nonefalse

答案 2 :(得分:1)

如果您查看python documentation,您会看到cmp函数返回-1 self < other

__cmp__(obj, None) == -1以来,它假定为obj < None

我猜如果__cmp__(obj, None)应该返回1,因为任何对象都优于无对象:)