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']={}