我似乎无法创建没有__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__"))
仍然让我真实。只是好奇这里发生了什么。
答案 0 :(得分:2)
在底层C实现中,__hash__
方法实际上是在type structure指向的函数中实现的;它不作为普通属性存在,因此无法删除它。
如果您想表明某个类型没有实现__hash__
方法,那么您应该为该属性指定None
。