Python 2 __getattr__最大递归深度

8
例如,我使用以下代码:
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个回答

13

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

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

还请注意,缺少else从句会导致未定义的属性似乎具有值None


2
尝试了你的解决方案,但是它引发了 KeyError 异常。 - M1k3
1
这是因为在尝试在__init__方法中构建self.dict1时,您试图访问self.A。这会触发对__getattr__的调用,它假定存在self.dict1 - holdenweb
也许不太优雅,但如果我在创建dict1后设置'B',它就能工作,像这样:self.dict1['B'] = self.A - M1k3
只要你有能用的东西,优雅可以稍后再来! - holdenweb
不要忘记,如果你实现了 __setattr__ 方法,那么 __init__ 方法应该使用 self.__dict__['dict1'] = {} - holdenweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接