【问题标题】:Why doesn't this Python code cause an endless loop in __hash__?为什么这段 Python 代码不会在 __hash__ 中导致无限循环?
【发布时间】: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))

标签: python circular-reference


【解决方案1】:

如果您只是从__hash__() 中调用self.__hash__(),那么您肯定会陷入无限循环。但是,您改为调用 self.__str__().__hash__()

__str__() 方法返回一个字符串对象,这意味着 self.__str__().__hash__() 正在调用一个完全不同的类 (String) 的 __hash__ 方法 - 因此,您实际上并没有调用再次相同的功能。这就是你没有无限循环的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多