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?
- Class():def cmp uu(self,obj):
- 好吧,让我编辑问题代码,以避免任何混乱。
- 看你的错误,你看你比较的方法永远不会回到真实。这意味着你的比较函数没有严格的顺序。
- 你确定你属于EDOCX1吗?
- 测试函数写入分离测试文件
江户公约1〔0〕是:
1 2 3
| a < b : return -1
a = b : return 0
a > b : return 1 |
当然,只有当a和b都是兼容类型(比如数字)时,这才有意义。如果您有一个"角情况",其中a或b要么是无要么不兼容(not instanceof),那么您应该报告一个错误,因为这是在您的someClass实例上使用比较运算符时出现的编程错误。
可以使用__cmp__实现任何行为,但是与none比较OP描述的方式最终会导致奇怪的行为和错误。
另见:uuu lt_uuu而不是uuu cmp__http://docs.python.org/reference/datamodel.html#object.__cmp__
- 如果以相反的方式传递,任何两个对象都应该进行比较。否则,python对订单所做的一些假设是无效的。
- 谢谢你的澄清。
当obj为None时,程序返回-1,而返回负整数表示self < obj,所以obj1 < None为True,obj1 > None为false。
- 我不明白你是怎么得出结论说obj1>none是假的。
- @prashantkumar,实际上python不关心操作符是什么,它只是计算cmp(obj1,None),看看会返回什么值,在您的例子中,值是-1,所以解释器告诉obj1 > None是假的。
- 好的,非常感谢你的澄清。
- @Prashantkumar,不客气。
如果您查看python文档,您将看到cmp函数返回-1,如果self < other。
自__cmp__(obj, None) == -1以来,假设为obj < None。
我想,如果__cmp__(obj, None)返回1作为任何对象都优于任何对象:)
- 对不起,这没用。我的问题是,我们得出的结论是(obj1none)会变为假。