为什么我不能删除" __ hash __"属性?

时间:2016-02-28 20:47:51

标签: python-3.x built-in

我似乎无法创建没有__hash__属性的对象(hasattr(Obj, "__hash__")返回False}。我试图这样做是为了测试目的,但现在我很好奇为什么我不能。我尝试过的几件事情如下:

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__"))仍然让我真实。只是好奇这里发生了什么。

1 个答案:

答案 0 :(得分:2)

在底层C实现中,__hash__方法实际上是在type structure指向的函数中实现的;它不作为普通属性存在,因此无法删除它。

如果您想表明某个类型没有实现__hash__方法,那么您应该为该属性指定None