执行有界方法时未更新Python字典键
我试图通过订阅服务器/模式从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 =
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