Closure(闭包)
什么是闭包?简单说,闭包就是根据不同的配置信息得到不同的结果。
专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。
概念总是有点抽象,下面结合示例说下我自己的理解。
特点
- 外部函数包裹内部函数
- 外部函数最终返回一个函数对象,即一个内部函数实例
- 外部函数传入的参数不同时,会返回不同的内部函数实例
- 外部函数用于
绑定
,内部函数用于处理
- 外部函数绑定的参数为
函数
时,即为装饰器
示例
|
Decorator(装饰器)
前面已经提到,装饰器本质就是外部函数绑定参数为函数的闭包。
另外 Python 给它添加了一个更优雅的调用方式,用在被绑定函数f
之前添加@wrapper
的方式,代替在被绑定函数f
定义后使用f = wrapper(f)
手动赋值的方式,来进行绑定。
示例
|
保持函数默认参数常新的装饰器
Cookbook 20.1 里有个特别的例子。
Python 里函数的默认参数只在函数定义时求值一次,然后存入函数内建的 func_defaults 元组内。如果是不可变参数(如 1、’qwe’、None 等),完全没有问题;但如果是类似列表这样的可变参数,重新调用函数时默认的列表可能已经面目全非。
书中提供了两种解决该问题的方法:
标准方法
|
装饰器方法
|