Python装饰器实现方法及应用场景详解


Posted in Python onMarch 26, 2020

应用场景:

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)

日志是装饰器运用的另一个亮点。这是个例子:

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.、在函数中嵌入装饰器

我们回到日志的例子,并创建一个包裹函数,能让我们指定一个用于输出的日志文件

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 相关文章推荐
Python 命令行参数sys.argv
Sep 06 Python
简单理解Python中基于生成器的状态机
Apr 13 Python
Python计算字符宽度的方法
Jun 14 Python
Python编程中实现迭代器的一些技巧小结
Jun 21 Python
python设计微型小说网站(基于Django+Bootstrap框架)
Jul 08 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
python 变量初始化空列表的例子
Nov 28 Python
Python3实现将一维数组按标准长度分隔为二维数组
Nov 29 Python
tensorflow之变量初始化(tf.Variable)使用详解
Feb 06 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
python文件及目录操作代码汇总
Jul 08 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 #Python
Python多进程编程常用方法解析
Mar 26 #Python
简单了解python调用其他脚本方法实例
Mar 26 #Python
Python tornado上传文件的功能
Mar 26 #Python
Python Tornado批量上传图片并显示功能
Mar 26 #Python
python列表删除和多重循环退出原理详解
Mar 26 #Python
执行Python程序时模块报错问题
Mar 26 #Python
You might like
PHP自动更新新闻DIY
2006/10/09 PHP
福利彩票幸运号码自动生成器
2006/10/09 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
easyui form validate总是返回false的原因及解决方法
2016/11/07 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
Python抓取百度查询结果的方法
2015/07/08 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
pandas 层次化索引的实现方法
2019/07/06 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
细节决定成败演讲稿
2014/05/12 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书