访问装饰器中的函数属性



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

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

相关内容

  • 没有找到相关文章

最新更新