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 相关文章推荐
Eclipse + Python 的安装与配置流程
Mar 05 Python
python抓取最新博客内容并生成Rss
May 17 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
Django使用httpresponse返回用户头像实例代码
Jan 26 Python
Python OpenCV处理图像之图像直方图和反向投影
Jul 10 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
在交互式环境中执行Python程序过程详解
Jul 12 Python
python默认参数调用方法解析
Feb 09 Python
Python-jenkins 获取job构建信息方式
May 12 Python
Python无损压缩图片的示例代码
Aug 06 Python
python 如何引入协程和原理分析
Nov 30 Python
Python实现双向链表
May 25 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
多重?l件?合查?(二)
2006/10/09 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
express 项目分层实践详解
2018/12/10 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
Python字符串的一些操作方法总结
2019/06/10 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
Python运行DLL文件的方法
2020/01/17 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
python实现滑雪游戏
2020/02/22 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
python绘图模块之利用turtle画图
2021/02/12 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
C/C++有关内存的思考题
2015/12/04 面试题
如何转换一个字符串到enum值
2014/04/12 面试题
大学生护理专业自荐信
2013/10/03 职场文书
护士自我鉴定
2013/10/23 职场文书
《乡愁》教学反思
2014/02/18 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
房地产项目合作意向书
2015/05/08 职场文书
考研英语辞职信
2015/05/13 职场文书