覆盖 __cmp__ python函数

overriding __cmp__ python function

嗨,我要压倒江户十一〔0〕。如果传递的第二个对象是None或不是someClass的实例,则返回-1

我不明白这里到底发生了什么。

1
2
3
4
5
6
class someClass():
    def __cmp__(self, obj):
        if obj == None:
            return -1
        if not isinstance(obj, someClass):
            return -1

我的测试功能:

1
2
3
4
5
6
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


江户公约1〔0〕是:

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

当然,只有当ab都是兼容类型(比如数字)时,这才有意义。如果您有一个"角情况",其中ab要么是无要么不兼容(not instanceof),那么您应该报告一个错误,因为这是在您的someClass实例上使用比较运算符时出现的编程错误。

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

另见:uuu lt_uuu而不是uuu cmp__http://docs.python.org/reference/datamodel.html#object.__cmp__


objNone时,程序返回-1,而返回负整数表示self < obj,所以obj1 < NoneTrueobj1 > Nonefalse


如果您查看python文档,您将看到cmp函数返回-1,如果self < other

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

我想,如果__cmp__(obj, None)返回1作为任何对象都优于任何对象:)