为什么这个__getattr__函数不起作用?

0 投票
2 回答
1099 浏览
提问于 2025-04-16 23:49

我写了一个小类,想试试自定义的 __getattr__ 方法,但每次运行它时,都会出现一个属性错误:

class test:
    def __init__(self):
        self.attrs ={'attr':'hello'}
    def __getattr__(self, name):
        if name in self.attrs:
            return self.attrs[name]
        else:
            raise AttributeError

t = test()
print test.attr

然后输出是:

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    print test.attr
AttributeError: class test has no attribute 'attr'

这是怎么回事?我以为在抛出属性错误之前会先调用 getattr 呢?

2 个回答

4

你需要在实例t)上查询属性,而不是在test)上查询:

>>> t = test()
>>> print t.attr
hello
8

因为这个类 test 没有attr 当作属性,但实例 t 是有这个属性的:

class test:
    def __init__(self):
        self.attrs ={'attr':'hello'}
    def __getattr__(self, name):
        if name in self.attrs:
            return self.attrs[name]
        else:
            raise AttributeError

t = test()
print t.attr

撰写回答