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实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
Python实现单词拼写检查
Apr 25 Python
Python函数式编程指南(一):函数式编程概述
Jun 24 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
深入理解python对json的操作总结
Jan 05 Python
利用python操作SQLite数据库及文件操作详解
Sep 22 Python
Python探索之SocketServer详解
Oct 28 Python
python Pexpect 实现输密码 scp 拷贝的方法
Jan 03 Python
python3字符串操作总结
Jul 24 Python
django做form表单的数据验证过程详解
Jul 26 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
Mar 03 Python
Python实现生成bmp图像的方法
Jun 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python3获取当前目录的实现方法
2019/07/29 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
德国网上药房:Apotal
2017/04/04 全球购物
化学实验员岗位职责
2013/12/28 职场文书
入党转预备思想汇报
2014/01/07 职场文书
就业协议书范本
2014/04/11 职场文书
单位委托书
2014/10/15 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python