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中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
Python实现分割文件及合并文件的方法
Jul 10 Python
浅析Python 中整型对象存储的位置
May 16 Python
用于业余项目的8个优秀Python库
Sep 21 Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 Python
Python获取网段内ping通IP的方法
Jan 31 Python
python issubclass 和 isinstance函数
Jul 25 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
python3连接mysql获取ansible动态inventory脚本
Jan 19 Python
vue常用指令代码实例总结
Mar 16 Python
将python字符串转化成长表达式的函数eval实例
May 11 Python
如何使用python写截屏小工具
Sep 29 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技术开发技巧分享
2010/03/23 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
PHP遍历并打印指定目录下所有文件实例
2014/02/10 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python中的ctime()方法使用教程
2015/05/22 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
python 实现登录网页的操作方法
2018/05/11 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
pandas数据拼接的实现示例
2020/04/16 Python
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
金鑫耀Java笔试题
2014/09/06 面试题
大学专科生推荐信范文
2013/11/23 职场文书
专科毕业生自我鉴定
2013/12/01 职场文书
初中学校对照检查材料
2014/08/19 职场文书
劳动模范获奖感言
2015/07/31 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书