内容绝大部分出自《Python高级编程》,Luke Sneeringer,清华大学出版社,Python版本2.7。
代码部分经修改可以完整运行,方便理解和直接测试。
理解语法
添加文档说明
获取被装饰函数相关参数,详见Python官方文档-Code objects
这部分内容我也不是很理解。可以边看文档边用ipython之类的工具配合查看理解。
|
|
装饰器应用的顺序,自下而上(因为函数的解析是自内而外的)
装饰器的使用
例如静态方法@staticmethod
和类方法@classmethod
,单元测试mock模块的@mock.path
和@mock.path.object
。Web框架Django的@login_required
(用户必须登录才能查看特定页面)和@permission_required
(权限限制),Flask的@app.route
,Celery的@task
等。
装饰器显示的对函数进行前置和收尾工作,减少了代码的重复,并且增加了可读性。它主要应用在以下几个地方(主要 说的可能有些草率):
- 在被装饰函数之前或之后追加功能,如合法性检查,权限验证,记录函数结果等
- 预处理函数的参数(如改变格式),处理函数的返回值(如格式化输出JSON或XML等),附加参数等
- 函数的注册
装饰器的编写
函数装饰器(这里说函数装饰器是因为还有类装饰器)通常接受一个callable函数作为参数,返回一个可调用函数(注意,返回的可能不是那个函数了呦)。
示例一:函数注册表
另一个例子:
示例二:类型检查
另一个例子,在上述代码的基础上,追加了@functools.wraps(func)
,help(foo)
返回结果则不同了,没有暴露出我们的狸猫换太子。
|
|
示例三:用户验证
|
|
示例四:输出格式化
|
|
另一个例子:捕获特定异常并JSON输出
示例五:日志管理
|
|
带参数的装饰器
废话少说,放码过来
理想的装饰器应该是这样的:
@json_output
@json_output()
@json_output(参数)
所以对上述代码作如下修改:
|
|