为什么我不能删除“__hash__”属性?

Why can't I delete the "__hash__" attribute?

我似乎无法创建没有 __hash__ 属性的对象(即 hasattr(Obj, "__hash__") returns 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__")) 仍然是正确的。只是好奇这里发生了什么。

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

如果你想表明一个类型没有实现 __hash__ 方法,那么你应该将 None 分配给属性。