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脚本和ADB命令实现卸载App
Feb 10 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
python+selenium实现简历自动刷新的示例代码
May 20 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
使用python切片实现二维数组复制示例
Nov 26 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
Pycharm 如何设置HTML文件自动补全代码或标签
May 21 Python
使用Djongo模块在Django中使用MongoDB数据库
Jun 20 Python
一些让Python代码简洁的实用技巧总结
Aug 23 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
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
新鲜出炉的js tips提示效果
2011/04/03 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
python简单实现刷新智联简历
2016/03/30 Python
python编写弹球游戏的实现代码
2018/03/12 Python
python实现教务管理系统
2018/03/12 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
网上商城创业计划书范文
2014/01/31 职场文书
实习指导老师评语
2014/04/26 职场文书
为自己工作观后感
2015/06/11 职场文书
人民的好儿女观后感
2015/06/18 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
珍爱生命主题班会
2015/08/13 职场文书