Python - 在__hash__方法定义中使用默认的__hash__方法

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__()对象是该实例的类的方法?

war*_*iuc 6

要调用父实现,请使用:

super(Foo, self).__hash__()
Run Code Online (Sandbox Code Playgroud)

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

你重写了一个神奇的方法,所以可以直接调用parent的实现.

  • 在这种情况下它是相同的.顺便问一下,你在使用python 3吗?如果没有,你应该有'object`的`Foo`子类. (2认同)