Python装饰器的写法以及应用场景
2019-12-26 21:08
1211 查看
应用场景:
1、授权(Authorization)
装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint)。它们被大量使用于Flask和Django web框架中。这里是一个例子来使用基于装饰器的授权:
from functools import wraps # 最新版python引用是 import functools def requires_auth(f): # f 就是我们需要装饰的函数,一看就是不带参数的装饰器 @wraps(f) # 新版python写法 @functools.wraps(f) def decorated(*args, **kwargs): auth = request.authorization if not auth or not check_auth(auth.username, auth.password): authenticate() return f(*args, **kwargs) return decorated # 该装饰器需相关配置才能运行,这里是截取代码展示应用
2.、日志(Logging)
日志是装饰器运用的另一个亮点。这是个例子:
''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' from functools import wraps def logit(func): @wraps(func) def with_logging(*args, **kwargs): print(func.__name__ + " was called") return func(*args, **kwargs) return with_logging @logit def addition_func(x): """Do some math.""" return x + x result = addition_func(4)
我敢肯定你已经在思考装饰器的一个其他聪明用法了。
3.、带参数的装饰器
带参数的装饰器是典型的闭包函数
4.、在函数中嵌入装饰器
我们回到日志的例子,并创建一个包裹函数,能让我们指定一个用于输出的日志文件
''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' from functools import wraps def logit(logfile='out.log'): def logging_decorator(func): @wraps(func) def wrapped_function(*args, **kwargs): log_string = func.__name__ + " was called" print(log_string) # 打开logfile,并写入内容 with open(logfile, 'a') as opened_file: # 现在将日志打到指定的logfile opened_file.write(log_string + '\n') return func(*args, **kwargs) return wrapped_function return logging_decorator @logit() def myfunc1(): pass myfunc1() # Output: myfunc1 was called # 现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串 @logit(logfile='func2.log') def myfunc2(): pass myfunc2() # Output: myfunc2 was called # 现在一个叫做 func2.log 的文件出现了,里面的内容就是上面的字符串
5.、装饰器类
现在我们有了能用于正式环境的logit装饰器,但当我们的应用的某些部分还比较脆弱时,异常也许是需要更紧急关注的事情。比方说有时你只想打日志到一个文件。而有时你想把引起你注意的问题发送到一个email,同时也保留日志,留个记录。这是一个使用继承的场景,但目前为止我们只看到过用来构建装饰器的函数。
幸运的是,类也可以用来构建装饰器。那我们现在以一个类而不是一个函数的方式,来重新构建logit。
相关文章推荐
- 装饰器模式以及继承的应用场景
- Python——异常(内置异常以及应用场景)
- Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》
- Python高效开发之Django、Flask、Tornado三大主流 Python web框架的对比以及各自的应用场景
- Python之禅---2、python介绍和应用场景介绍
- python实现单例模式及应用场景
- C#中特性,以及应用场景(收藏链接)
- 索引的应用场景以及如何使用
- 这里share一下我写的mpi版本的lr算法以及应用场景
- python 多个装饰器组合应用,实现面向切面之AOP编程
- javascript之闭包理解以及应用场景
- 外键是否采用看业务应用场景,以及开发成本
- DotNET企业架构应用实践-基于接口开发介绍以及应用场景和案例
- RabbitMQ的应用场景以及基本原理介绍
- python练习之安装,基础知识应用以及脚本编写
- 常见的六种设计模式以及应用场景
- Python 3实现k-邻近算法以及 iris 数据集分类应用
- 跨域方案JSONP与CORS的各自优缺点以及应用场景
- mysql索引的应用场景以及如何使用
- ES的数组类型以及应用场景