函数装饰器和闭包
装饰器基础知识
装饰器是可调用对象,其参数是另一个函数(被装饰的函数)。装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象。
假如有一个名为decorate的装饰器:
@decorate
def target():
print('running target()')
上述代码的效果与下述写法一样:
def target():
print('running target()')
target = decorate(target)
两种写法的最终结果一样:上述两个代码片段执行完毕后得到的target不一定是原来那个target函数,而是decorate(target)返回的函数。
严格来说,装饰器只是语法糖。装饰器可以像常规的可调用对象那样调用,其参数是另一个函数。有时,这样更方便,尤其是元编程(在运行时改变程序行为)时。
综上,装饰器的一大特征是,能把被装饰的函数替换为其他函数。第二个特性是,装饰器在加载模块时立即执行,这通常是在导入时(即python加载模块时。
闭包
闭包时指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。 参考下面函数:
def make_averager():
series = []
def averager(new_value):
...