我想重新定义对象的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调用。 )

作为documented__getattr__被称为“当在常规位置找不到属性查找时(即,它不是实例属性,也不是在自身的类树中找到)”。就像在同一地方所记录的那样,即使该属性确实存在,也总是调用另一个魔术方法__getattribute__

10-06 01:55