【发布时间】:2014-07-14 14:19:57
【问题描述】:
我是一个python新手,我只是想了解here的逻辑:
class SomeClass:
#...
def __hash__(self):
return self.__str__().__hash__()
def __str__(self):
arr = []
if self.final:
arr.append("1")
else:
arr.append("0")
for (label, node) in self.edges.iteritems():
arr.append( label )
arr.append( str( node.id ) )
return "_".join(arr)
#...
someObj = SomeClass()
hash(someObj)
我的阅读方式是这样的:
如果我尝试在 SomeClass 类的对象上调用 hash() 函数 -> 那么将执行 __hash__ 魔术方法。 __hash__ 方法调用 __str__ 方法,然后在 __str__ 方法的结果上第二次调用 __hash__ 方法 -> 恕我直言,这会导致循环引用和无限循环......
有人可以向我解释一下 - 这不是一个无限循环,__hash__ 被一遍又一遍地调用吗?
【问题讨论】:
-
我假设 __str__() 将此对象更改为字符串,这意味着您将调用 String 类的 __hash__() 方法,而不是此类
-
推测,
__str__返回一个字符串,然后对其进行哈希处理。除非SomeClass.__str__被实现为return self(它真的不应该这样!)这绝对没问题 - 你正在散列一个字符串对象,而不是SomeClass实例(即调用str.__hash__,而不是SomeClass.__hash__)。 -
@StevenRumbalski 老实说,我只是拿了一个代码from here。是 -> str 返回一个字符串。
-
@jonrsharpe 啊。明白了。我现在明白其中的逻辑了。
-
那段代码应该写成
return hash(str(self))。