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解析xml文件操作实例
Oct 05 Python
Python实现爬取知乎神回复简单爬虫代码分享
Jan 04 Python
python实现定时播放mp3
Mar 29 Python
Python实现命令行通讯录实例教程
Aug 18 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
python生成ppt的方法
Jun 07 Python
Django项目开发中cookies和session的常用操作分析
Jul 03 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
通过PYTHON来实现图像分割详解
Jun 26 Python
python实现将json多行数据传入到mysql中使用
Dec 31 Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 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读取html并截取字符串的简单代码
2009/11/30 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
react配置antd按需加载的使用
2019/02/11 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
python简单实现刷新智联简历
2016/03/30 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
Python中函数的返回值示例浅析
2019/08/28 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
行政专员工作职责
2013/12/22 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
Go语言应该什么情况使用指针
2021/07/25 Golang
python实现局部图像放大
2021/11/17 Python