Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典的键可以是类的实例吗?_Python - Fatal编程技术网

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
不会改变,你就很好。

A
class
可以是
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()方法就足够了。\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哈希
方法,就是。。。