为什么这段Python代码不会在\uuuuu散列\uuuuuuuuu中引起一个无休止的循环?
我是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为什么这段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
__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)