6
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 method called with self=hello,other=there
True
False

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

如果我只是return False__cmp__函数中,这个报告也是True如此!!如果我 return -1,那么我得到False- 但由于我正在尝试比较字符串,这感觉不对。

我在这里做错了什么?

4

5 回答 5

10

__cmp__(x,y)如果 应该返回一个负数(例如 -1),如果x < y是一个正数(例如 1),如果是x > y0 x == y。你永远不应该用它返回一个布尔值。

你重载的是__eq__(x, y).

于 2010-01-27T11:01:19.527 回答
5

当self < other,self == other,self > other时,该__cmp__方法应返回-1、0或1。

你可以做

return cmp(self.name, other.name)

在您的代码中以获得正确的结果

于 2010-01-27T11:01:16.517 回答
4

你混淆__cmp____eq__.

从以下文档__cmp__

如果 self < other 则返回负整数,如果 self == other 则返回零,如果 self > other 则返回正整数。

__eq__返回一个确定两个对象是否相等的布尔值,__cmp__返回一个确定两个对象是否大于或小于彼此的整数,除非您有特定__eq__的 、__ne____le__、和方法__ge__,否则会调用它。__lt____gt__

在您的情况下,您确实需要一种__cmp__方法,而不是__eq__因为它会节省您为其他比较实施其他 5 种方法。

您可以使用该cmp()函数并将以下内容放入您的__cmp__方法中:

return cmp(self.name,other.name)

请注意,正如 Ignacio 所强调的,不是 Python 3.0 中的首选方法,但在 Python 2.x__cmp__中是可行的方法。

于 2010-01-27T11:03:54.380 回答
2

__cmp__()已过时。定义__lt__(), __eq__(), 和__gt__()代替。

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

于 2010-01-27T11:00:17.993 回答
0

查找文档__cmp__,您应该返回一个整数:

如果 self < other 则返回负整数,如果 self == other 则返回零,如果 self > other 则返回正整数。

于 2010-01-27T11:03:27.417 回答