2016-02-28 67 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

相关问题