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并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
Django中cookie的基本使用方法示例
Feb 03 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
Python3 单行多行万能正则匹配方法
Jan 07 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
基于python3的socket聊天编程
Feb 17 Python
python logging设置level失败的解决方法
Feb 19 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
TensorFlow中如何确定张量的形状实例
Jun 23 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
python绘图subplots函数使用模板的示例代码
Apr 30 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 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
代码生成器 document.write()
2007/04/15 Javascript
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
使用jquery自定义鼠标样式满足个性需求
2013/11/05 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
python利用beautifulSoup实现爬虫
2014/09/29 Python
Python中splitlines()方法的使用简介
2015/05/20 Python
浅析Python编写函数装饰器
2016/03/18 Python
python 换位密码算法的实例详解
2017/07/19 Python
Android分包MultiDex策略详解
2017/10/30 Python
PyQt5实现下载进度条效果
2018/04/19 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
Django框架验证码用法实例分析
2019/05/10 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
Python高并发和多线程有什么关系
2020/11/14 Python
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
学年末自我鉴定
2014/01/21 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
体育运动口号
2014/06/09 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
主持人开场白台词
2015/05/29 职场文书