Skip to main content
 首页 » 编程设计

python之为什么这段 Python 代码不会在 __hash__ 中导致死循环

2025年05月04日9三少

我是 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__ 被一遍又一遍地调用?

请您参考如下方法:

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

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