是否有一个类似__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。

这不是类或实例变量的问题。这是一个属性是否存在的问题;你的attr1存在,但其他的不存在。(您对attr2所做的不会创建属性;你只是创建了一个局部变量,然后把它扔掉。如果您执行self.attr2 = 1,您将看到__getattr__也没有为attr2调用。

如文档所述,__getattr__被称为"当属性查找没有在通常的地方找到属性时(即它不是实例属性,也不是在self类树中找到)"。正如在同一地方记录的那样,还有另一个魔术方法__getattribute__,即使该属性确实存在,也总是被调用。

最新更新