重写python函数

重写python函数,python,Python,您好,我正在覆盖\uu\cmp\uu。如果传递的第二个对象是None,或者它不是someClass的实例,则返回-1 我不明白这里到底发生了什么 class someClass(): def __cmp__(self, obj): if obj == None: return -1 if not isinstance(obj, someClass): return -1 我的测试功能: def test

您好,我正在覆盖
\uu\cmp\uu
。如果传递的第二个对象是
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.
def测试功能(自):
obj1=someClass()
self.assertTrue(obj1无)
#当返回False时,我会失败。
谁能给我解释一下:

  • 返回值是什么
  • 当比较符号改变时,它如何决定是返回
    True
    还是
    False

对于
\uuuuu cmp\uuuuu
的约定是:

a < b : return -1
a = b : return 0
a > b : return 1
ab:返回1
当然,只有当
a
b
都是兼容类型(比如数字)时,这才有意义。如果您有一个“角落案例”,其中
a
b
没有或不兼容(
非实例of
),您应该报告一个错误,因为这是在
someClass
实例上使用比较运算符时发生的编程错误

可以使用
\uuu cmp\uuu
实现任何行为,但是与OP描述的方式进行比较最终会导致奇怪的行为和bug

另见:
http://docs.python.org/reference/datamodel.html#object.__cmp__

如果您查看python,您将看到
cmp
函数返回
-1
If
self

由于
\uuu cmp\uj(obj,None)=-1
,因此假定
obj


我猜如果
\uu cmp\uj(obj,None)
应该返回
1
,因为任何对象都优于没有对象:)

obj
None
时,程序将返回-1,而返回负整数意味着
self
,因此
obj1
真的,和
obj1>None
is
false

class someClass():def\uu cmp\uuuuuself(self,obj):好的,让我编辑问题代码以避免任何混淆,无论您看到什么错误,比较方法都不会返回true。这意味着您的比较函数没有定义严格的顺序。您确定
test\u函数
属于
someClass
?test\u函数写在单独的测试文件中,如果以相反的方式传递,则任何两个对象都应该进行相反的比较。否则Python关于订单的一些假设是无效的。抱歉,这没有帮助。我的问题是从我们得出的结论(obj1None)将变为假。我不明白你是如何得出obj1>None为假的结论的。@PrashantKumar,实际上python不在乎操作符是什么,它只计算
cmp(obj1,None)
,然后看看返回什么值,在您的例子中,值为-1,因此解释器告诉
obj1>None
为false。