是否可以访问装饰器内的功能属性? 考虑下面的代码。
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_projects\test_suite\func_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
正如所料。
答案 0 :(得分:1)
感谢装饰器,全局名称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