【发布时间】:2017-04-22 01:25:02
【问题描述】:
我写了一个简单的装饰器:
from functools import wraps
import random
def my_dec(f):
lst = list()
@wraps(f)
def wrapper(*args):
lst.append(random.randint(0, 9))
print(lst)
return f(*args)
return wrapper
@my_dec
def foo():
print("foo called")
现在,如果我多次调用foo,lst 不会被刷新。相反,它会随着时间的推移而积累。因此,foo 的多次调用会返回如下输出:
foo()
> [4]
> foo called
foo()
> [4, 9]
> foo called
foo()
> [4, 9, 1]
> foo called
...
这是为什么呢?我认为decorator 只是my_dec(foo) 的语法糖?!我假设每次调用my_dec 都会刷新lst。
【问题讨论】:
-
你说得对,装饰器只是
foo = my_dec(foo)的语法糖......但我不明白这会如何让你认为lst会被“冲洗”。这里要小心——my_dec只会被调用一次,无论你调用多少次foo... -
哦,是的,你是对的。我认为每次调用
foo时都会调用my_dec,但显然不是,因为foo = my_dec(foo)只发生一次。感谢您的澄清! -
附加问题:我可以通过某种方式访问
lst吗?
标签: python python-3.x decorator python-decorators