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编程实现粒子群算法(PSO)详解
Nov 13 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
python dataframe astype 字段类型转换方法
Apr 11 Python
Python全排列操作实例分析
Jul 24 Python
Python中分支语句与循环语句实例详解
Sep 13 Python
python实现汉诺塔算法
Mar 01 Python
python中使用zip函数出现错误的原因
Sep 28 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 Python
Python 实现集合Set的示例
Dec 21 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 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
第七章 php自定义函数实现代码
2011/12/30 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
关于this和self的使用说明
2010/08/01 Javascript
jquery中动态效果小结
2010/12/16 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
JavaScript实现自动切换图片代码
2016/10/11 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
写给领导的感谢信
2015/01/22 职场文书
综合测评自我评价
2015/03/06 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
Python中22个万用公式的小结
2021/07/21 Python
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript