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访问纯真IP数据库的代码
May 19 Python
python基于右递归解决八皇后问题的方法
May 25 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
Python学习笔记之变量、自定义函数用法示例
May 28 Python
flask框架单元测试原理与用法实例分析
Jul 23 Python
解决Python设置函数调用超时,进程卡住的问题
Aug 08 Python
详解pycharm2020.1.1专业版安装指南(推荐)
Aug 07 Python
Python中的xlrd模块使用整理
Jun 15 Python
Python面向对象之成员相关知识总结
Jun 24 Python
python和anaconda的区别
May 06 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与SQL注入攻击[二]
2007/04/17 PHP
PHP中::、->、self、$this几种操作符的区别介绍
2013/04/24 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
2017/06/07 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
微信小程序动态增加按钮组件
2018/09/14 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
理解python正则表达式
2016/01/15 Python
详解python开发环境搭建
2016/12/16 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
python爬虫实例详解
2018/06/19 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
宣传部部长竞选演讲稿
2014/04/26 职场文书
大学三年计划书范文
2014/04/30 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
听证通知书
2015/04/24 职场文书
2016年校长新年寄语
2015/08/17 职场文书