我正在尝试使用自定义哈希函数为 python
dataclasse
编写一个基类,如下所示。但是,在调用子类的hash
时,它不会使用父类的自定义哈希函数。
import dataclasses
import joblib
@dataclasses.dataclass(frozen=True)
class HashableDataclass:
def __hash__(self):
print("Base class hash was called!")
fields = dataclasses.fields(self)
values = tuple(getattr(self, field.name) for field in fields)
return int(joblib.hash(values), 16)
@dataclasses.dataclass(frozen=True)
class MyDataClass1(HashableDataclass):
field1: int
field2: str
obj1 = MyDataClass1(1, "Hello")
print(hash(obj1))
有没有办法覆盖数据类的哈希函数?
您应该检查文档:
如果 eq 和 freeze 都为 true,则默认情况下 dataclass() 将为您生成一个 hash() 方法。如果 eq 为 true 并且 freeze 为 false,则 hash() 将被设置为 None,将其标记为不可散列(确实如此,因为它是可变的)。如果 eq 为 false,则 hash() 将保持不变,这意味着将使用超类的 hash() 方法(如果超类是 object,这意味着它将回退到基于 id 的哈希)。
@dataclasses.dataclass(frozen=True, eq=False) # <- HERE
class MyDataClass1(HashableDataclass):
field1: int
field2: str
输出:
>>> obj1 = MyDataClass1(1, "Hello")
Base class hash was called!
1356025966893372872