在装饰器中访问函数属性

2024-03-28 11:40:33 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以访问decorator中的函数属性? 考虑下面这段代码。在

def deco(a):
    def wrap():
        print(a.status)
        a()
        print(a.status)



    return wrap


@deco
def fun1():
    fun1.status="bar"


fun1.status="foo"
fun1()

我预期输出是:

^{pr2}$

但我得到以下错误:

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)

输出:

^{pr2}$

一如预期。在


Tags: 函数infoodefstatuslinebarattribute
1条回答
网友
1楼 · 发布于 2024-03-28 11:40:33

多亏了decorator,全局名fun1被绑定到装饰结果,因此绑定到嵌套的wrap()函数对象。然而,在wrap()中,a指的是原始的未包装函数对象。在

所以有两个不同的函数对象,每个对象都有属性,它们不是相同的对象。fun1.status是与a.status不同的属性。在

您可以在decorator中访问与fun1相同的对象wrap

print(wrap.status)

演示:

^{pr2}$

相关问题 更多 >