Python 2 __getattr__最大递归深度

时间:2016-01-16 15:45:07

标签: 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()

当它运行时,它会抛出超出的最大递归深度。 有人可以告诉我这里我做错了什么

1 个答案:

答案 0 :(得分:5)

self.dict1方法中对__getattr__的引用会导致再次调用__getattr__,依此类推,因此无限递归。在self内访问__getattr__属性的唯一安全方法是使用对self.__dict__的引用。尝试

def __getattr__(self, key):
    if key in self.__dict__['dict1']:
        return self.__dict__['dict1'][key]

另请注意,缺少else子句意味着未定义的属性似乎具有值None