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  连接字符串(join %)
Sep 06 Python
python中函数默认值使用注意点详解
Jun 01 Python
python docx 中文字体设置的操作方法
May 08 Python
利用python循环创建多个文件的方法
Oct 25 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
python对常见数据类型的遍历解析
Aug 27 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
Python实现自动访问网页的例子
Feb 21 Python
OpenCV读取与写入图片的实现
Oct 13 Python
python中如何使用虚拟环境
Oct 14 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 Python
python数字类型和占位符详情
Mar 13 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 输出字符串函数详解
2010/05/13 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
javascript 中that的含义示例介绍
2014/05/14 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
python中的句柄操作的方法示例
2019/06/20 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
python基于opencv检测程序运行效率
2019/12/28 Python
python3处理word文档实例分析
2020/12/01 Python
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
给海归自荐信的建议
2013/12/13 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
2014年实习生工作总结
2014/11/27 职场文书
2015年招生工作总结
2015/05/04 职场文书
2015财务年终工作总结范文
2015/05/22 职场文书
舌尖上的中国观后感
2015/06/02 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery