有很多人抱怨,把这个特性命名为“装饰器”不好。主要原因是,这个名称与 GoF 书 1 使用的不一致。装饰器这个名称可能更适合在编译器领域使用,因为它会遍历并注解句法树。
——“PEP 318 — Decorators for Functions and Methods”
1指 1995 年出版的英文原版《设计模式:可复用面向对象软件的基础》,作者是四个人,人们称之为“四人组”(Gang of Four)。
函数装饰器用于在源码中“标记”函数,以某种方式增强函数的行为。这是一项强大的功能,但是若想掌握,必须理解闭包。
nonlocal 是新近出现的保留关键字,在 Python 3.0 中引入。作为 Python 程序员,如果严格遵守基于类的面向对象编程方式,即便不知道这个关键字也不会受到影响。然而,如果你想自己实现函数装饰器,那就必须了解闭包的方方面面,因此也就需要知道 nonlocal。
除了在装饰器中有用处之外,闭包还是回调式异步编程和函数式编程风格的基础。
本章的最终目标是解释清楚函数装饰器的工作原理,包括最简单的注册装饰器和较复杂的参数化装饰器。但是,在实现这一目标之前,我们要讨论下述话题:
Python 如何计算装饰器句法
Python 如何判断变量是不是局部的
闭包存在的原因和工作原理
nonlocal 能解决什么问题
掌握这些基础知识后,我们可以进一步探讨装饰器:
实现行为良好的装饰器
标准库中有用的装饰器
实现一个参数化装饰器
下面将首先介绍装饰器的基础知识,然后再讨论上面列出的各个话题。