Python 字典的键可以是类的实例吗?
假设我有一个Python 字典的键可以是类的实例吗?,python,Python,假设我有一个类a,它具有\uuuuueq\uuuuu(self,other)功能。现在我想要一个字典,其中键是类的实例(以及值和数字,但这不会有什么区别)。然后我得到一个错误: unhashable type: 'a' 在文档中,它说我应该定义\uuuuu eq\uuuu和\uuuu cmp\uuuuu,以便定义\uuuu hash\uuuuuu,但这是不可能的,因为我的类是不可比较的 如何解决这个问题,伙计们 编辑:好的,我让它只使用\u eq\u和\u hash\u方法工作,但我仍然不确定
类a
,它具有\uuuuueq\uuuuu(self,other)
功能。现在我想要一个字典,其中键是类的实例(以及值和数字,但这不会有什么区别)。然后我得到一个错误:
unhashable type: 'a'
在文档中,它说我应该定义\uuuuu eq\uuuu
和\uuuu cmp\uuuuu
,以便定义\uuuu hash\uuuuuu
,但这是不可能的,因为我的类是不可比较的
如何解决这个问题,伙计们
编辑:好的,我让它只使用\u eq\u和\u hash\u方法工作,但我仍然不确定python是在in操作中使用hash方法还是使用\u eq\u方法(我希望是这样)它对我有效
>>> class A:
... def __init__(self):
... self.a = 5
...
>>> a = A()
>>> d = { a:"hello"}
>>> d[a]
'hello'
您可以使用类实例作为dict的键,它对我有用
>>> class A:
... def __init__(self):
... self.a = 5
...
>>> a = A()
>>> d = { a:"hello"}
>>> d[a]
'hello'
您可以使用类实例作为dict的键a
类
可以是dict
的键,只要类
的hashCode
是常量。如果在任何时间点,类的键,hashCode
可以更改,那么您将无法将其用作键
这正是
列表
不能用作键的原因。列表的另一种选择是使用元组
,因为元组
是不可变的。同样,如果你能保证hashCode
不会改变,你就很好。Aclass
可以是dict
的键,只要类的hashCode
是常量。如果在任何时间点,类的键,hashCode
可以更改,那么您将无法将其用作键
这正是列表
不能用作键的原因。列表的另一种选择是使用元组
,因为元组
是不可变的。同样,如果你能保证hashCode不会改变,你就很好。这不是一个直接的答案,但可能会对你有所帮助
您可以重写\uuu cmp\uuuu
并引发未实现错误
,以避免使用它
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
演示:
这不是一个直接的答案,但它可能会帮助你
您可以重写\uuu cmp\uuuu
并引发未实现错误
,以避免使用它
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
演示:
在\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
因此,在您的情况下,定义\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo()
方法就足够了。说明除了\uuuuuuuuuuuuuuuuuu
因此,在您的情况下,定义\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()方法就足够了。?这个类应该是抽象的@varantir您只需在\uuuuuuu hash\uuuuuu
中添加一个伪print语句,以测试它是否正在调用该语句。另外,我建议您检查我的答案,以确保您的哈希函数是sound.def\uuuu hash\uuuu(self):返回哈希(self.value^31&15)self.value应该是什么?这个类应该是抽象的@varantir您只需在\uuuuuuu hash\uuuuuu
中添加一个伪print语句,以测试它是否正在调用该语句。另外,我建议你检查我的答案,以确保你的哈希函数是正确的。你可以使用类实例作为dict的键-只要它们有一个合适的\uuuuuuuuuuuuuuuuuuuu
方法,也就是说…你可以使用类实例作为dict的键-只要它们有一个合适的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu哈希
方法,就是。。。