Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有像uu getattr uu这样的函数可以为类变量调用?_Python_Python 2.7_Getattr - Fatal编程技术网

Python 是否有像uu getattr uu这样的函数可以为类变量调用?

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 =

我想重新定义一个对象的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
,您将看到
\uuu getattr\uuuuuu
也不会为
attr2
调用
。)


正如,
\uuuu getattr\uuuu
被称为“当属性查找未在通常位置找到该属性时(即,它不是实例属性,也未在类树中找到它本身)”。正如在同一个地方所记录的,还有另一个神奇的方法
\uuuu getattribute\uuuu
,它总是被调用,即使属性确实存在。

啊,太好了,这完美地回答了我的问题,谢谢你是的,对不起,我注意到我的代码中有一个bug——我会解决这个问题,如果您希望在访问对象属性时运行代码,您可能会喜欢,尽管类级属性需要