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生成器的使用方法
Nov 21 Python
Python实现求数列和的方法示例
Jan 12 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
python字符串替换第一个字符串的方法
Jun 26 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
Python threading的使用方法解析
Aug 28 Python
python正则表达式匹配IP代码实例
Dec 28 Python
编写python代码实现简单抽奖器
Oct 20 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 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 echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
Laravel 5.3 学习笔记之 错误&日志
2016/08/28 PHP
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
你必须知道的Javascript知识点之"this指针"的应用
2013/04/23 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
vue输入节流,避免实时请求接口的实例代码
2019/10/30 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
python fabric使用笔记
2015/05/09 Python
详解在Python程序中自定义异常的方法
2015/10/16 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
Python实现京东秒杀功能代码
2019/05/16 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
美国美妆网站:B-Glowing
2016/10/12 全球购物
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
财务管理个人自荐书范文
2013/11/24 职场文书
个性与发展自我评价
2014/02/11 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
践行三严三实心得体会
2014/10/13 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
python可视化之颜色映射详解
2021/09/15 Python
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript