之前对于装饰器的理解感觉比较片面,没成体系,在此记录一下装饰器的学习之路
Decorators is to modify the behavior of the function through a wrapper so we don’t have to actually modify the function.
也就是说,所谓装饰器,就是通过装饰器函数,来修改原函数的一些功能,使原函数在不需要修改的情况下达到某些目的。通常广泛应用于日志,身份认证,缓存等方面。
函数装饰器
先看一个简单例子
1 | def my_decorator(func): |
@
被称为语法糖,@my_decorator就相当于my_decorator(greet),当然,my_decorator和greet函数也能带参数
1 | def my_decorator(func): |
这样也不是万无一失的,我们发现greet函数的元信息发生了变化
1 | greet.__name__ |
为了解决这个问题,通常使用内置装饰器@functools.wrap
,它会帮助我们保留函数的元信息
1 | import functools |
类装饰器
不仅不可以使用函数装饰器,类也可以使用装饰器。类装饰器主要依赖于__call__
函数
1 | class Count: |
装饰器也可以是嵌套使用
1 |
|
相当于
1 | decorator1(decorator2(decorator3(func))) |
实际用法
最常用的应该还是日志记录。如果想要测试某些函数的耗时时长,装饰器就是一种常用方式
1 | import time |
对于身份认证来说,往往使用需要登录之后才能使用的功能,例如评论,在校验这种身份的时候也经常使用装饰器来校验
1 | import functools |
另外,对于测试来说,往往需要传入某种格式固定的参数,例如传入值的先后顺序时候合法等,也常用装饰器来进行校验
1 | import functools |