gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:27:03 24 4
gpt4 key购买 nike

我有一个类,我想为这个类写一个__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__() 方法的情况下使用对象的默认哈希值?

最佳答案

调用父实现使用:

super(Foo, self).__hash__()

It also occurred to me that I could rewrite it as return
object.__hash__(self)
. This works, but seems even worse, as special methods are not intended to be called directly.

你重写了一个魔术方法,所以直接调用父类的实现是可以的。

关于Python - 在 __hash__ 方法定义中使用默认的 __hash__ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11716258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com