2010-01-27 133 views
5
class x: 
    def __init__(self,name): 
     self.name=name 

    def __str__(self): 
     return self.name 

    def __cmp__(self,other): 
     print("cmp method called with self="+str(self)+",other="+str(other)) 
     return self.name==other.name 
     # return False 


instance1=x("hello") 
instance2=x("there") 

print(instance1==instance2) 
print(instance1.name==instance2.name) 

输出是:__cmp__方法在Python 2.x中没有像预期的那样工作?这里

cmp method called with self=hello,other=there 
True 
False 

这是不是我所期待的:我想说“两个实例都是平等的,如果名字字段相等”。

如果我只是从__cmp__功能return False,这也报告为True! 如果我返回-1,那么我得到False - 但由于我试图比较字符串,这不正确。

我在这里做错了什么?

回答

9

__cmp__(x,y)应该返回一个负数(如-1)如果x < y,一个正数(如1)如果x > y和0如果x == y。你不应该返回一个布尔值。

你超载的是__eq__(x, y)

+0

Thankyou - 你会得到蜱虫(尽管其他人提供了类似的信息),因为这是最清楚的解释! – monojohnny 2010-01-27 12:41:23

+0

正如其他人所评论的,__cmp __()已过时。定义__lt __(),__eq __()和__gt __()来代替。按照http://docs.python.org/dev/whatsnew/3.0.html#ordering-comparisons – smci 2011-06-30 03:51:31

2

__cmp__()已过时。改为定义__lt__(),__eq__()__gt__()

即便如此,你做错了。你应该返回一个整数。

+0

“过时”?你从哪里挑选的?其他的存在,但在大多数情况下,使用__cmp__更有意义,在这种情况下,例如,它需要3个方法而不是一个。 http://docs.python.org/reference/datamodel.html – jsbueno 2010-01-27 11:07:05

+1

@jsbueno:第三项要点:http://docs.python.org/dev/3.0/whatsnew/3.0.html#ordering-comparisons – 2010-01-27 11:11:50

+0

URL已移动到http://docs.python.org/dev/whatsnew/3.0.html#ordering-comparisons – smci 2011-06-30 03:49:25

5

__cmp__方法应该返回-1,0或1,当自己<其他时,自己==其他,自己>别的。

你可以做

return cmp(self.name, other.name) 

在你的代码正确的结果

+0

谢谢!原来我的意思是'__eq__'! – monojohnny 2010-01-27 12:42:07

0

查找为__cmp__的文档,你就是应该返回一个整数:

应该返回一个负整数,如果 自我<等,零,如果自其他==,一个 正整数,如果自我>等。

4

你很困惑__cmp____eq__

From the documentation of __cmp__:

应该返回一个负整数,如果自我<等,零,如果自其他==,一个正整数,如果自我>等。

__eq__返回一个布尔值,它确定是否两个对象相等,__cmp__返回其确定两个对象比彼此更大或更小的整数,所以被称为除非有特定__eq____ne____le____ge____lt____gt__方法。

对于您的情况,您确实需要__cmp__方法而不是__eq__,因为这样可以节省您为其他比较实施其他5种方法。

您可以使用cmp() function,并在您__cmp__方法如下:

return cmp(self.name,other.name) 

注意,as highlighted by Ignacio是这个isn't the preferred method in Python 3.0,但在Python 2.x的__cmp__是要走的路。

相关问题