簡體   English   中英

如何讓 python 數據類繼承 __hash__?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM