Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.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_Dictionary_Object_Methods_Key - Fatal编程技术网

执行有界方法时未更新Python字典键

执行有界方法时未更新Python字典键,python,dictionary,object,methods,key,Python,Dictionary,Object,Methods,Key,我试图通过订阅服务器/模式从python对象更新密钥,这是更大代码库的一部分,但我想检查一下我是否在这里做了一些错误的事情 from dataclasses import dataclass @dataclass class A: a:float=2 def mod(self,name): self.a = name def __hash__(self): return hash(self.a) 执行时 >>>a =

我试图通过订阅服务器/模式从python对象更新密钥,这是更大代码库的一部分,但我想检查一下我是否在这里做了一些错误的事情

from dataclasses import dataclass
 
@dataclass
class A:
    a:float=2
    def mod(self,name):
        self.a = name
    def __hash__(self):
        return hash(self.a)
执行时

>>>a = A()
>>>b = B()
>>>print(a.a)
>>>b.attach(a)
>>>print(b.x)
正如所料:

{A(a=2): <bound method A.mod of A(a=2)>}
尝试检索该方法时

>>>print(b.x.get(a)) 

显然,问题来自散列的定义方式。散列应该考虑一些属性。字典需要根据需要使用散列键

拥有一个散列()意味着类的实例是不可变的。可变性是一个复杂的属性,它取决于程序员的意图、eq()的存在和行为,以及dataclass()decorator中eq和冻结标志的值

>>>print(b.x[a])
<bound method A.mod of A(a=2)>
>>b.dispatch()
>>print(b.x)
{A(a=3): <bound method A.mod of A(a=3)>}
>>>print(list(b.x.keys())[0] is a)
True
>>>print(b.x.get(a)) 
None