Python2\uuu getattr\uuuu最大递归深度
例如,我使用以下代码:Python2\uuu getattr\uuuu最大递归深度,python,getattr,Python,Getattr,例如,我使用以下代码: class A(object): def __init__(self): self.dict1 = { 'A': 3, 'B': self.A} def __getattr__(self, key): if key in self.dict1: return self.dict1[key] a = A() 当它运行时,抛出最大递归深度。 有人能告诉我我
class A(object):
def __init__(self):
self.dict1 = {
'A': 3,
'B': self.A}
def __getattr__(self, key):
if key in self.dict1:
return self.dict1[key]
a = A()
当它运行时,抛出最大递归深度。
有人能告诉我我做错了什么吗在
\uuuu getattr\uuuu
方法中对self.dict1
的引用导致再次调用\uu getattr\uuuuu
,依此类推,从而产生无限递归。访问内部的self
属性的唯一安全方法是使用对self.\uuuu dict.\uuu
的引用。试一试
def __getattr__(self, key):
if key in self.__dict__['dict1']:
return self.__dict__['dict1'][key]
还请注意,缺少else
子句将意味着未定义的属性似乎具有值None
尝试您的解决方案,并且它会引发KeyError,这是因为在尝试在\uuu init\uuu
方法中构造self.dict1
时,您尝试tp访问self.A
。这会触发对\uu getattr\uuuu
的调用,该调用假设存在self.dict1
。可能不是很精致,但如果我在dict1创建后设置“B”,它会起作用,如下所示:self.dict1['B']=self.a
。优雅可以稍后再来!也不要忘记,如果您实现\uuuuu setattr\uuuuu
,那么\uuuu init\uuuuuuu
方法应该使用self.\uuu dict\uuuuu['dict1']={}
。