字典键可以是一个类的实例吗?

时间:2013-11-30 10:56:32

标签: python

假设我有class a,其函数为__eq__(self,other)。现在我想要一个字典,其中键是类的实例(和值数字,但这不应该有所不同)。然后我收到错误:

unhashable type: 'a'

在文档中,它说我应该定义__eq____cmp__以定义__hash__,但这是不可能的,因为我的课程无法比较!!

如何解决这个问题,伙计们!

编辑:好的我只使用 _ eq _ _ 哈希 _ 方法,但我仍然不确定python是否在 操作中使用哈希方法或 _ eq _ 方法(应该是我的情况)希望)

4 个答案:

答案 0 :(得分:3)

documentation表示在__hash__()旁边需要__eq__() (不是“和”你建议的)__cmp__()方法。

因此,在您的情况下,定义__hash__()方法就足够了。

答案 1 :(得分:1)

class可以是dict的关键字,只要hashCode的{​​{1}}是常量。如果在任何时间点,类的密钥class可以更改,那么您将无法将其用作密钥。

这正是hashCode无法用作密钥的原因。 list的替代方法是使用list,因为tuple是不可变的。同样,如果你可以保证tuples不会改变,你就会很好。

答案 2 :(得分:0)

对我有用..

>>> class A:
...     def __init__(self):
...             self.a = 5
... 
>>> a = A()
>>> d = { a:"hello"}
>>> d[a]
'hello'

您可以使用类实例作为dict的键

答案 3 :(得分:0)

这不是直接的答案,但可能对您有所帮助。

您可以覆盖__cmp__并举起NotImplementedError以避免使用它。

class SomeClass():
    def __init__(self):
        pass  # your init here

    def __cmp__(self, orher):
        raise NotImplementedError('You can not compare this')

    def __eq__(self, other):
        pass  # Your eq here

    def __hash__(self):
        pass  # your hash function here 

演示:

>> s = SomeClass()
>> s == '12'

>> NotImplementedError: You can not compare this