我想重新定义对象的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__
,即使该属性确实存在,也总是被调用。