python 装饰器的实际作用有哪些


Posted in Python onSeptember 07, 2020

终于知道python的装饰器是怎么回事,那在工作中,到底能干吗用呢?
尤其对我这个只会写写脚本又不做python开发的小测试/手动无辜脸。

先说结论,肯定是有用处滴。

一、自动化测试中使用

就拿写的自动化测试来说吧,如果我想统一的输出点东西,比如:case的运行时长,case名称等等,那就可以用起来。

首先,看下最简单的case,没有装饰器:

import pytest

def test_01():
 a = 1
 b = 2
 assert a < b

def test_02():
 a = 1
 b = 1
 assert a-b == 0

if __name__ == '__main__':
 pytest.main(['demo_test.py'])

这个用例文件里有2个case,运行一下:

============================= test session starts =============================
platform win32 -- Python 3.8.5, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: D:\练习
collected 2 items

demo_test.py .. [100%]

============================== 2 passed in 0.01s ==============================
[Finished in 0.4s]

运行通过就是.,所以2个case都通过了,有2个.。

如果我想在运行结果里看到每个case的执行时长,那么就可以写一个装饰器去处理:

import pytest
import functools
import time

def log_execute_time(func):
 @functools.wraps(func)
 def wrapper(*args, **kwargs):
  start = time.perf_counter()
  res = func(*args, **kwargs)
  end = time.perf_counter()
  print("{} 用时 {} ms".format(func.__name__, (end - start) * 1000))
  return res
 return wrapper

@log_execute_time
def test_01():
 a = 1
 b = 2
 assert a < b

@log_execute_time
def test_02():
 a = 1
 b = 1
 assert a-b == 0

if __name__ == '__main__':
 pytest.main(['-s','demo_test.py'])

运行一下:

============================= test session starts =============================
platform win32 -- Python 3.8.5, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: D:\练习
collected 2 items

demo_test.py
test_01 用时 0.0007999999999674934 ms .
test_02 用时 0.0012999999999818712 ms .

============================== 2 passed in 0.03s ==============================
[Finished in 0.4s]

可以看到,每个case执行会打印出执行耗时。

上述的这个例子是在实现自动化测试时的场景,具体还是要看你怎么去挖掘你的需求。

二、其他python开发向的用法

我也去查了下其他的用法,其实在python开发中,用途还是很多的,其中就还有大家熟悉的"身份认证"。

比如大家爱上博客园,你不登录账号也可以浏览博客。当你看着兴起,自己也想评论或者发文的时候,发现
提示你需要登录,这种场景就可以用上装饰器。代码举例:

import functools

def authenticate(func):
 @functools.wraps(func)
 def wrapper(*args, **kwargs):
  request = args[0]
  if check_user_logged_in(request): # 检查用户是否登录
   return func(*args, **kwargs) # 如果登录了,就可以执行函数post_comment() 发送评论
  else:
   raise Exception('Authentication failed') # 否则,身份验证失败
 return wrapper
 
@authenticate
def post_comment(request)
 pass

上述代码只是说了这个意思,辅助描述下场景。

除此之外,还可以在输入合理性检查、缓存等多个场景中使用,毕竟不是做开发的,这里就不再深入了。

三、装饰器小结

装饰器本质上是一个python函数或者类,可以让其他函数或类在不需要做任何代码修改的前提下,增加额外的功能。
装饰器的返回值也是一个函数对象或者类对象。

有了装饰器,我们可以抽离出大量与函数功能本身无关的雷同代码到装饰器中,并且可以重用。
说到这,我感觉跟AOP面向切面编程有点像。

大家还知道哪些应用场景,也欢迎留言补充。

以上就是python 装饰器的实际作用有哪些的详细内容,更多关于python 装饰器作用的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python编码最佳实践之总结
Feb 14 Python
解决Python requests 报错方法集锦
Mar 19 Python
Django数据库表反向生成实例解析
Feb 06 Python
python+opencv+caffe+摄像头做目标检测的实例代码
Aug 03 Python
python把1变成01的步骤总结
Feb 27 Python
解决Python列表字符不区分大小写的问题
Dec 19 Python
Pycharm最新激活码2019(推荐)
Dec 31 Python
python numpy库np.percentile用法说明
Jun 08 Python
Python实现寻找回文数字过程解析
Jun 09 Python
python如何对链表操作
Oct 10 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
浅谈哪个Python库才最适合做数据可视化
Jun 28 Python
通俗讲解python 装饰器
Sep 07 #Python
彻底搞懂python 迭代器和生成器
Sep 07 #Python
python如何设置静态变量
Sep 07 #Python
获取CSDN文章内容并转换为markdown文本的python
Sep 06 #Python
浅谈Python描述数据结构之KMP篇
Sep 06 #Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 #Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 #Python
You might like
php 设计模式之 工厂模式
2008/12/19 PHP
php Smarty 字符比较代码
2011/02/27 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
Python多线程编程简单介绍
2015/04/13 Python
python去除所有html标签的方法
2015/05/05 Python
深入理解Python中装饰器的用法
2016/06/28 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
pytorch打印网络结构的实例
2019/08/19 Python
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
求网格中的黑点分布
2013/11/06 面试题
高级护理专业毕业生推荐信
2013/12/25 职场文书
半年思想汇报
2013/12/30 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
房屋授权委托书范本
2014/10/07 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书