我想在我制作的某些类上使用集合。我希望这些集合限制该类对象的多样性。但是我有一个问题。考虑一下这个玩具示例:
class Thing(object):
def __init__(self, value):
self.value = value
def __eq__(self, other):
return self.value == other.value
def __repr__(self):
return str(self.value)
a = Thing(5)
b = Thing(5)
s = set()
s.add(a)
s.add(b)
print s
此代码的输出为:
set([5, 5])
我只是假设set()会使用__eq__
来确定是否应该包含该对象,但它可能使用is
。有一个简单的解决方法,输出只是set([5])
?
答案 0 :(得分:9)
您需要定义类的__hash__
方法,以便根据value
返回哈希码。
换句话说,您需要将课程设为 hashable 。
class Thing(object):
def __init__(self, value):
self.value = value
def __eq__(self, other):
return self.value == other.value
def __repr__(self):
return str(self.value)
def __hash__(self):
return hash(self.value)
a = Thing(5)
b = Thing(5)
s = set()
s.add(a)
s.add(b)
print s