在装饰器中访问函数属性
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
是否可以在装饰器中访问函数属性? 考虑下面的一段代码。
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