重写__cmp__ python函数

Pra*_*mar 3 python

嗨,我压倒一切__cmp__.如果传递的第二个对象是None,或者它不是实例someClass,则返回-1.

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

class someClass():
    def __cmp__(self, obj):
        if obj == None:
            return -1
        if not isinstance(obj, someClass):
            return -1  
Run Code Online (Sandbox Code Playgroud)

我的测试功能:

def test_function(self):  
        obj1 = someClass()
        self.assertTrue(obj1 < None)
        # I get true.
        self.assertTrue(obj1 > None)
        # I get failure as False is returned.
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下:

  • 什么是回报值?
  • 它是如何决定是否会返回TrueFalse何时更改比较标志?

Rud*_*uer 8

惯例__cmp__是:

a < b : return -1
a = b : return 0
a > b : return 1
Run Code Online (Sandbox Code Playgroud)

当然,这使得只有当正义ab兼容类型,比如说数字.如果你有一个'极端情况',其中a或者b是None或不兼容(not instanceof),你应该报告错误,因为这是在你的实例上使用比较运算符时的编程错误someClass.

有可能实现任何行为__cmp__,但与OP描述的方式进行比较最终会导致奇怪的行为和错误.

另见:__ lt__而不是__cmp__ http://docs.python.org/reference/datamodel.html#object.__cmp__