我有一堂课,我希望为这门课写一个__hash__()
方法。我想写的方法将在某些情况下返回对象的默认哈希值,并在其他情况下返回其属性之一的哈希值。所以,作为一个简单的测试案例:
class Foo:
def __init__(self, bar):
self.bar = bar
def __hash__(self):
if self.bar < 10:
return hash(self) # <- this line doesn't work
else:
return hash(self.bar)
问题在于hash(self)
只是调用self.__hash__()
,导致无限递归。
我认为对象的哈希基于该对象的id()
,因此我可以将return hash(self)
重写为return id(self)
或return id(self) / 16
,但似乎我在自己的代码中重新创建默认实现的错误形式。
我也想到我可以将其重写为return object.__hash__(self)
。这可行,但似乎更糟糕,因为不打算直接调用特殊方法。
所以,我问的是;有没有办法使用对象的默认哈希值而不隐式调用该对象是实例的类的__hash__()
方法?
答案 0 :(得分:6)
要调用父实现,请使用:
super(Foo, self).__hash__()
我也想到我可以将其重写为
return object.__hash__(self)
。这有效,但看起来更糟,特别 方法无意直接调用。
你正在覆盖一个神奇的方法,所以可以直接调用parent的实现。