3

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

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

正如预期的那样。

4

1 回答 1

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
于 2017-11-17T09:52:02.390 回答