为什么我不能删除“__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
分配给属性。
我似乎无法创建没有 __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
分配给属性。