是否可以访问装饰器中的函数属性?考虑下面的代码段。
def deco(a):
def wrap():
print(a.status)
a()
print(a.status)
return wrap
@deco
def fun1():
fun1.status="bar"
fun1.status="foo"
fun1()
我预计输出是:
foo
bar
但是我收到以下错误:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
fun1()
File "D:python_projectstest_suitefunc_attribute.py", line 3, in wrap
print(a.status)
AttributeError: 'function' object has no attribute 'status'
有没有办法使这项工作,因为
def fun1():
fun1.status="bar"
fun1.status="foo"
a=fun1
print(a.status)
a()
print(a.status)
输出:
foo
bar
不出所料。
多亏了装饰器,全局名称fun1
绑定到修饰结果,因此绑定到嵌套的wrap()
函数对象。但是,在wrap()
内部,a
是指原始的、未包装的函数对象。
所以你有两个不同的函数对象,每个对象都可以有属性;它们不是相同的对象。 fun1.status
是与a.status
不同的属性。
您可以在装饰器中访问与fun1
相同的对象,如wrap
:
print(wrap.status)
演示:
>>> def deco(a):
... def wrap():
... print(wrap.status)
... a()
... print(wrap.status)
... return wrap
...
>>> @deco
... def fun1():
... fun1.status="bar"
...
>>> fun1.status="foo"
>>> fun1()
foo
bar