重写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
Ifself
由于\uuu cmp\uj(obj,None)=-1
,因此假定obj
我猜如果
\uu cmp\uj(obj,None)
应该返回1
,因为任何对象都优于没有对象:)当obj
为None
时,程序将返回-1,而返回负整数意味着self
,因此obj1
是真的,和obj1>None
isfalse
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。