为什么这段Python代码不会在\uuuuu散列\uuuuuuuuu中引起一个无休止的循环?

为什么这段Python代码不会在\uuuuu散列\uuuuuuuuu中引起一个无休止的循环?,python,circular-reference,Python,Circular Reference,我是python新手,我只是想理解其中的逻辑: 我阅读的方式是: 若我尝试在类SomeClass->的对象上调用hash函数,那个么将执行_uhash__; magic方法__散列方法调用uuuu str uuuuu方法,然后第二次调用uuu散列uuuuu方法,结果是uuuu str uuuuu方法->它会导致循环引用和无限循环 有人能给我解释一下吗?为什么这不是一个无止境的循环,一次又一次地被调用?如果你只是在调用self.\uuuuuuuuuuhash\uuuuuuuuuuuuuuuuuuu

我是python新手,我只是想理解其中的逻辑:

我阅读的方式是:

若我尝试在类SomeClass->的对象上调用hash函数,那个么将执行_uhash__; magic方法__散列方法调用uuuu str uuuuu方法,然后第二次调用uuu散列uuuuu方法,结果是uuuu str uuuuu方法->它会导致循环引用和无限循环

有人能给我解释一下吗?为什么这不是一个无止境的循环,一次又一次地被调用?

如果你只是在调用self.\uuuuuuuuuuhash\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是,你叫self.str.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

__str________________.\u_hash___调用的是一个完全不同的类字符串的_hash__方法,因此,实际上不再调用同一个函数。这就是为什么你没有一个无止境的循环。

如果你只是在调用self。\uuuuhash\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是,你叫self.\uuuu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


__str________________.\u_hash___调用的是一个完全不同的类字符串的_hash__方法,因此,实际上不再调用同一个函数。这就是为什么没有无止境的循环。

我假设\uuuu str\uuuuuuuuuu将这个对象更改为字符串,这意味着您将调用字符串类的\uuu hash\uuuuuuuu方法,而不是这个类的方法,大概,\uuuu str\uuuuuuuuuu返回一个字符串,然后对其进行哈希处理。除非SomeClass.\uuuu str\uuuuuu被实现为返回self,而它实际上不应该是返回self!这绝对没问题-您正在散列字符串对象,而不是SomeClass实例,即调用str.\uuuuuHash\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。是->str返回一个字符串。@jornsharpe-Ahh。明白了。我现在理解了逻辑。代码应该写为return hashstrself。我假设uu str_u_u_u将此对象更改为字符串,这意味着您将调用string类的u hash_u方法,而不是这个类的uu str_u_u_u_u_u方法可能会返回一个字符串,然后对其进行哈希处理。除非SomeClass.\uuuu str\uuuuuu被实现为返回self,而它实际上不应该是返回self!这绝对没问题-您正在散列字符串对象,而不是SomeClass实例,即调用str.\uuuuuHash\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。是->str返回一个字符串。@jornsharpe-Ahh。明白了。我现在理解了逻辑。代码应该写为return hashstrself。
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)