为什么这个Python代码不会在__hash__中导致无限循环?

时间:2014-07-14 14:19:57

标签: python circular-reference

我是一个蟒蛇新手,我只是想了解逻辑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__方法,然后在__hash__方法的结果上第二次调用__str__方法 - >哪个imho导致循环引用和无限循环...

有人可以向我解释 - 这是不是一次又一次地调用__hash__的无限循环?

1 个答案:

答案 0 :(得分:10)

如果您只是在self.__hash__()内拨打__hash__(),那么肯定会有无限循环。但是,您正在调用self.__str__().__hash__()

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