如何重写Python数据类的哈希函数? [重复]

问题描述 投票:0回答:1

我正在尝试使用自定义哈希函数为 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))

有没有办法覆盖数据类的哈希函数?

python inheritance hash python-dataclasses
1个回答
1
投票

您应该检查文档

如果 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
© www.soinside.com 2019 - 2024. All rights reserved.