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 生成不重复的随机数的代码
May 15 Python
Python MySQLdb模块连接操作mysql数据库实例
Apr 08 Python
在Python中使用poplib模块收取邮件的教程
Apr 29 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 Python
Python中常用的os操作汇总
Nov 05 Python
怎么用Python识别手势数字
Jun 07 Python
详解NumPy中的线性关系与数据修剪压缩
May 25 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读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
vue解决使用$http获取数据时报错的问题
2019/10/30 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
Python模块的加载讲解
2019/01/15 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
Python中的全局变量如何理解
2020/06/04 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
python打包多类型文件的操作方法
2020/09/21 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
如何提高JDBC的性能
2013/04/30 面试题
会计岗位职责模板
2014/03/12 职场文书
少先队工作总结2015
2015/05/13 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
python实现的人脸识别打卡系统
2021/05/08 Python
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
Python实现视频中添加音频工具详解
2021/12/06 Python