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 相关文章推荐
仅用50行Python代码实现一个简单的代理服务器
Apr 08 Python
python中字符串前面加r的作用
Jun 04 Python
python读写ini配置文件方法实例分析
Jun 30 Python
python常用知识梳理(必看篇)
Mar 23 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
python3.7 sys模块的具体使用
Jul 22 Python
python 三元运算符使用解析
Sep 16 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 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从数组中随机抽取一些元素的代码
2012/11/05 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP asXML()函数讲解
2019/02/03 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
2016/06/08 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
JS中数据结构之栈
2019/01/01 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
Python制作CSDN免积分下载器
2015/03/10 Python
python下MySQLdb用法实例分析
2015/06/08 Python
速记Python布尔值
2017/11/09 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
python图像处理入门(一)
2019/04/04 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
python requests库的使用
2021/01/06 Python
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
妇产科护士自我鉴定
2013/10/15 职场文书
讲解员培训方案
2014/05/04 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
Python中使用ipython的详细教程
2021/06/22 Python
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python