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来开发Markdown脚本扩展的实例分享
Mar 04 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 Python
Python模块文件结构代码详解
Feb 03 Python
Django处理文件上传File Uploads的实例
May 28 Python
详解Python做一个名片管理系统
Mar 14 Python
pybind11和numpy进行交互的方法
Jul 04 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
Python如何读取、写入JSON数据
Jul 28 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
Python测试框架:pytest学习笔记
Oct 20 Python
Python操控mysql批量插入数据的实现方法
Oct 27 Python
Python编解码问题及文本文件处理方法详解
Jun 20 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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
对Session和Cookie的区分与解释
2007/03/16 PHP
paypal即时到账php实现代码
2010/11/28 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
PHP使用适合阅读的格式显示文件大小的方法
2015/03/05 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
Javascript实现字数统计
2015/07/03 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python2.7编程中SQLite3基本操作方法示例
2017/08/09 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python Jupyter运行时间实例过程解析
2019/12/13 Python
Pytorch to(device)用法
2020/01/08 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
python空元组在all中返回结果详解
2020/12/15 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
超市后勤自我鉴定
2014/01/17 职场文书
大学生饮食连锁店创业计划书
2014/01/17 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
学习经验交流会策划书
2015/11/02 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers