2

我有一个类,我想__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__()对象是其实例的类的方法?

4

1 回答 1

6

要调用父实现,请使用:

super(Foo, self).__hash__()

我还想到我可以将它重写为return object.__hash__(self). 这可行,但似乎更糟,因为不打算直接调用特殊方法。

您正在覆盖一个魔术方法,因此可以直接调用父级的实现。

于 2012-07-30T06:22:20.560 回答