为用户定义的类设置多重性

时间:2011-10-11 10:42:30

标签: python

我想在我制作的某些类上使用集合。我希望这些集合限制该类对象的多样性。但是我有一个问题。考虑一下这个玩具示例:

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])

1 个答案:

答案 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