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