假设我有class a
,其函数为__eq__(self,other)
。现在我想要一个字典,其中键是类的实例(和值数字,但这不应该有所不同)。然后我收到错误:
unhashable type: 'a'
在文档中,它说我应该定义__eq__
和__cmp__
以定义__hash__
,但这是不可能的,因为我的课程无法比较!!
如何解决这个问题,伙计们!
编辑:好的我只使用 _ eq _ 和 _ 哈希 _ 方法,但我仍然不确定python是否在 操作中使用哈希方法或 _ eq _ 方法(应该是我的情况)希望)
答案 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