我想重新定义一个对象的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。
答案 0 :(得分:3)
这不是类或实例变量的问题。这是属性是否存在的问题;您的attr2
存在但其他人则不存在。 (使用self.attr2 = 1
执行的操作不会创建属性;您只需创建一个局部变量并将其丢弃。如果执行__getattr__
,您会看到attr2
是也没有要求__getattr__
。)
作为documented,__getattribute__
被称为"当属性查找未在通常位置找到该属性时(即它不是实例属性,也不在类树中找到)为了自己)"。正如在同一个地方记录的那样,即使属性确实存在,也会有另一个魔术方法{{1}},即使该属性确实存在。