我正在阅读此post,我对__cmp__()
提出了一个问题。
我的代码
class Book(object):
def __init__(self, title, year):
self.title = title
self.year = year
def __hash__(self): # hash function
print "Self = ", self
print "Hash value of self = ", hash(str(self))
print "Hash value of title = ", hash(self.title)
print "Hash value of year = ", hash(self.year)
return 0
def __cmp__(self, other):
return self.title == other.title
books = []
books.append(Book("ABC", 123))
print hash(books[0])
books.append(Book("DEF", 456))
print hash(books[1])
books.append(Book("ABC", 123))
print hash(books[len(books)-1])
print len(books)
print cmp(books[0],books[2])
输出
Self = <__main__.Book object at 0x0000000001E77B00>
Hash value of self = -1040857764
Hash value of title = 826005955
Hash value of year = 123
0
Self = <__main__.Book object at 0x0000000001E77BA8>
Hash value of self = -992414627
Hash value of title = -589261154
Hash value of year = 456
0
Self = <__main__.Book object at 0x0000000001E77BE0>
Hash value of self = 1901105233
Hash value of title = -2015893559
Hash value of year = 789
0
Self = <__main__.Book object at 0x0000000001E77C18>
Hash value of self = -228580758
Hash value of title = 826005955
Hash value of year = 123
0
4
1 # How ?
字符串上的 ==
运算符返回一个布尔值
在此代码中,cmp()
比较两个字符串(即标题),因此cmp()
的返回值必须是Bool。
x > y
)答案 0 :(得分:1)
为什么我得到一个整数?
__cmp__
会返回int
。您的__cmp__
正在返回bool
,它是int
的子类,因此Python会将其解释为int
。
即使获得整数,它的值又如何决定?
如何使第1和第3个物体相等?
您的代码存在的问题是__cmp__
会返回==
的结果,该结果会返回bool
,它是int
的子类,True
}是1
,因此,0
返回__cmp__
/ True
而不是返回1
- 这是错误的。
您应该使用的方法(在以后的Pythons中移除__cmp__
)是__eq__
,__ne__
,__le__
,__lt__
,{{1 }和__ge__
。
使用__gt__
:
__eq__
请注意,这只是按标题进行比较,而不是考虑年份(可能会很好,也可能不会,取决于您将如何使用def __eq__(self, other):
if not isinstance(other, self.__class__):
return NotImplemented
return self.title == other.title
课程。)
您可以找到有关他们的更多信息here。