在装饰器中访问函数属性

accessing function attributes inside decorators

是否可以在装饰器中访问函数属性? 考虑下面的一段代码。

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

符合预期。

感谢装饰器,全局名称 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