Str*_*des 2 python methods hash magic-methods
我有一个类,我希望__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)
Run Code Online (Sandbox Code Playgroud)
这个问题就是hash(self)简单地调用self.__hash__(),导致无限递归.
我收集到一个对象的哈希是基于该对象的哈希id(),所以我可以重写return hash(self)为return id(self),或者return id(self) / 16,但是在我自己的代码中重新创建默认实现似乎是不好的形式.
我也想到我可以把它重写为return object.__hash__(self).这可行,但似乎更糟糕,因为不打算直接调用特殊方法.
所以,我要问的是; 有没有办法使用对象的默认哈希而不隐式调用该__hash__()对象是该实例的类的方法?
要调用父实现,请使用:
super(Foo, self).__hash__()
Run Code Online (Sandbox Code Playgroud)
我也想到我可以把它重写为
return object.__hash__(self).这可行,但似乎更糟糕,因为不打算直接调用特殊方法.
你重写了一个神奇的方法,所以可以直接调用parent的实现.