2016-02-28 68 views
0

我似乎無法創建沒有__hash__屬性(即哪個hasattr(Obj, "__hash__")返回False)的對象。我試圖做這個測試目的,但現在我很好奇,爲什麼我不能。我曾嘗試一些事情如下:爲什麼我不能刪除「__hash__」屬性?

class NoHash(object): 
    def __init__(self): 
     delattr(self, "__hash__") 

我們得到以下:

Traceback (most recent call last): 
    File "/home/irh/poly/tests/test_poly.py", line 23, in setUp 
    self.no_hash = NoHash() 
    File "/home/irh/poly/tests/test_poly.py", line 15, in __init__ 
    delattr(self, "__hash__") 
AttributeError: __hash__ 

此代碼產生任何錯誤:

class NoHash(object): 
    def __init__(self): 
     self.__hash__ = None 
     delattr(self, "__hash__") 

,但我得到的nhash = NoHash(); print(hasattr(nhash, "__hash__"))仍然給我真正。只是好奇這裏發生了什麼。

回答

2

在底層的C實現中,__hash__方法實際上是在type structure指向的函數中實現的;它不作爲普通屬性存在,所以不可能刪除它。

如果要指示某個類型未實現__hash__方法,則應該將該屬性改爲None

+0

對不起,如果這是非常愚蠢的事情要問......但問題是關於python。你的意思是Python的基礎C實現嗎? – irh

+0

是的。這就是爲什麼我把我所做的文檔鏈接起來。 –

+0

哇,對不起,甚至沒有注意到鏈接。感謝你的回答。 – irh

相關問題