我是一个蟒蛇新手,我只是想了解逻辑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__
的无限循环?
答案 0 :(得分:10)
如果您只是在self.__hash__()
内拨打__hash__()
,那么肯定会有无限循环。但是,您正在调用self.__str__().__hash__()
。
__str__()
方法返回一个字符串对象,这意味着self.__str__().__hash__()
正在调用一个完全不同的类(String)的__hash__
方法 - 因此,你实际上并没有再次调用相同的功能。这就是为什么你没有无限循环。