[英]How do I make a python dataclass inherit __hash__?
以下將起作用,但我寧願不需要在每個子類中重復__hash__
。 有沒有辦法告訴數據類繼承哈希函數(即不將其設置為None
)?
from dataclasses import dataclass
@dataclass
class Hashable:
def __hash__(self):
hashed = hash((
getattr(self, key)
for key in self.__annotations__
))
return hashed
@dataclass
class Node(Hashable):
name: str = 'Undefined'
def __hash__(self):
return Hashable.__hash__(self)
你的__hash__
被設置為None
的原因是dataclasses
試圖阻止你用腳射擊自己。 你的第二個類有eq=True
用於數據類裝飾器(這是默認值)。 從文檔:
以下是控制
__hash__()
方法的隱式創建的規則。 請注意,您不能在數據類中同時具有顯式__hash__()
方法並設置 unsafe_hash=True; 這將導致TypeError
。如果 eq 和frozen 都為真,默認情況下
__hash__()
() 會為你生成一個__hash__()
方法。 如果 eq 為真而frozen 為假,則__hash__() 將設置為None,將其標記為不可散列(確實如此,因為它是可變的)。 如果 eq 為假,__hash__()
將保持不變,這意味着將使用超類的__hash__()
方法(如果超類是object
,這意味着它將回退到基於 id 的散列)。
所以只需通過eq=False
:
In [1]: from dataclasses import dataclass
...:
...:
...: @dataclass
...: class Hashable:
...:
...: def __hash__(self):
...: hashed = hash((
...: getattr(self, key)
...: for key in self.__annotations__
...: ))
...: return hashed
...:
...:
...: @dataclass(eq=False)
...: class Node(Hashable):
...: name: str = 'Undefined'
...:
In [2]: hash(Node())
Out[2]: -9223372036579626267
但是,正如評論中指出的那樣,這不是很安全,因為您有一個可變對象,現在可以進行哈希處理,並且與它的__eq__
實現不一致,它是從Hashable
繼承的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.