Python 是否有像uu getattr uu这样的函数可以为类变量调用?
我想重新定义一个对象的get函数,以便在请求任何属性时可以进行拦截。使用getattr函数,当请求现有变量(例如本例中的attr1)时,它不会捕获。有没有办法解决这个问题,以便在请求attr1时运行函数Python 是否有像uu getattr uu这样的函数可以为类变量调用?,python,python-2.7,getattr,Python,Python 2.7,Getattr,我想重新定义一个对象的get函数,以便在请求任何属性时可以进行拦截。使用getattr函数,当请求现有变量(例如本例中的attr1)时,它不会捕获。有没有办法解决这个问题,以便在请求attr1时运行函数 class Test(object): attr1 = 1 def __init__(self): self.attr2 = 1 def __getattr__(self, attr): print 'GETATTR', attr a =
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
,您将看到\uuu getattr\uuuuuu
也不会为attr2
调用。)
正如,\uuuu getattr\uuuu
被称为“当属性查找未在通常位置找到该属性时(即,它不是实例属性,也未在类树中找到它本身)”。正如在同一个地方所记录的,还有另一个神奇的方法\uuuu getattribute\uuuu
,它总是被调用,即使属性确实存在。啊,太好了,这完美地回答了我的问题,谢谢你是的,对不起,我注意到我的代码中有一个bug——我会解决这个问题,如果您希望在访问对象属性时运行代码,您可能会喜欢,尽管类级属性需要