是否有类似__getattr__的函数被调用类变量?

时间:2015-08-10 19:19:44

标签: python python-2.7 getattr

我想重新定义一个对象的get函数,以便在请求任何属性时拦截。使用 getattr 函数,当请求现有变量(例如,在这种情况下为attr1)时,它不会捕获。有没有解决方法,所以我可以在请求attr1时运行一个函数?

class Test(object):
    attr1 = 1
    def __init__(self):
        self.attr2 = 1
    def __getattr__(self, attr):
        print 'GETATTR', attr
a = Test()
a.attr1
a.attr2
a.attr3

输出:

GETATTR attr3

我也希望在输出中看到GETATTR attr1和GETATTR attr2。

1 个答案:

答案 0 :(得分:3)

这不是类或实例变量的问题。这是属性是否存在的问题;您的attr2存在但其他人则不存在。 (使用self.attr2 = 1执行的操作不会创建属性;您只需创建一个局部变量并将其丢弃。如果执行__getattr__,您会看到attr2是也没有要求__getattr__。)

作为documented__getattribute__被称为"当属性查找未在通常位置找到该属性时(即它不是实例属性,也不在类树中找到)为了自己)"。正如在同一个地方记录的那样,即使属性确实存在,也会有另一个魔术方法{{1}},即使该属性确实存在。