Python的装饰器(decorator)可以说是Python的一个神器,它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能。Python的装饰器同时也是Python学习从入门到精通过程中必需要熟练掌握的知识。今天尝试用浅显的语言解释下Python装饰器的工作原理及如何编写自己的装饰器吧。
应用场景
- 附加功能
- 数据的清理或添加:
- 函数参数类型验证 @require_ints 类似请求前拦截
- 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改
- 为函数提供额外的数据 mock.patch
- 函数注册
- 在任务中心注册一个任务
- 注册一个带信号处理器的函数
你可能还是不理解装饰器是啥?没有关系,下面我们详细的解析一下到底如何去实现装饰器。
简单的装饰器
import time
def getTime(func):
def inner():
start = time.time()
func()
end = time.time()
print('用时:{}秒'.format(end-start))
return inner
@getTime
def func1():
time.sleep(2)
print("Func1 is running.")
if __name__ == '\_\_main\_\_':
func1()
上面的代码,func1函数被getTime函数装饰,这个装饰器实现的功能是统计func1函数执行的时间,这其实就是一个最简单的装饰器。
如何你还是不太理解,我们换种写法
import time
def getTime(func):
def inner():
start = time.time()
func()
end = time.time()
print('用时:{}秒'.format(end-start))
return inner
def func1():
time.sleep(2)
print("Func1 is running.")
res = getTime(func1)
print(res)
本质上的装饰器
Python的装饰器本质上是一个嵌套函数,它接受被装饰的函数(func)作为参数,并返回一个包装过的函数。这样我们可以在不改变被装饰函数的代码的情况下给被装饰函数或程序添加新的功能。
Python的装饰器广泛应用于引入日志,执行函数前预备处理,执行函数后清理功能,权限校验(如django中的@login_required和@permission_required装饰器)ÿ