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 相关文章推荐
tornado框架blog模块分析与使用
Nov 21 Python
python实现数独算法实例
Jun 09 Python
Python自定义主从分布式架构实例分析
Sep 19 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
Tornado 多进程实现分析详解
Jan 12 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
python 将list转成字符串,中间用符号分隔的方法
Oct 23 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
pycharm部署、配置anaconda环境的教程
Mar 24 Python
Python中有几个关键字
Jun 04 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实现的下载css文件中的图片的代码
2010/02/08 PHP
采用header定义为文件然后readfile下载(隐藏下载地址)
2014/01/31 PHP
php post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
2016/04/26 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
详解python如何在django中为用户模型添加自定义权限
2018/10/15 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
解决python运行启动报错问题
2020/06/01 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
毕业自我鉴定怎么写
2014/03/25 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
奥运会口号
2014/06/13 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
Java实现给Word文件添加文字水印
2022/02/15 Java/Android
Python Matplotlib绘制等高线图与渐变色扇形图
2022/04/14 Python
JavaScript设计模式之原型模式详情
2022/06/21 Javascript