访问装饰器内的函数属性

时间:2017-11-17 09:45:10

标签: python scope python-decorators function-object function-attributes

是否可以访问装饰器内的功能属性? 考虑下面的代码。

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

正如所料。

1 个答案:

答案 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
相关问题