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中常用的各种数据库操作模块和连接实例
May 29 Python
python3.5实现socket通讯示例(TCP)
Feb 07 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
python中的decimal类型转换实例详解
Jun 26 Python
Python正则表达式学习小例子
Mar 03 Python
django执行原始查询sql,并返回Dict字典例子
Apr 01 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
如何在mac版pycharm选择python版本
Jul 21 Python
python实现人工蜂群算法
Sep 18 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
Dec 17 Python
判断Python中的Nonetype类型
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
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
2020/03/18 PHP
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
Python中logging模块的用法实例
2014/09/29 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
python 获取url中的参数列表实例
2018/12/18 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
python飞机大战游戏实例讲解
2020/12/04 Python
《学会待客》教学反思
2014/02/22 职场文书
中学生寄语大全
2014/04/03 职场文书
会计学习心得体会
2014/09/09 职场文书
机关党员三严三实心得体会
2014/10/13 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
记者节感言
2015/08/03 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
python的html标准库
2022/04/29 Python
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers