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 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
Python编写检测数据库SA用户的方法
Jul 11 Python
收集的几个Python小技巧分享
Nov 22 Python
基于Python中capitalize()与title()的区别详解
Dec 09 Python
python配置grpc环境
Jan 01 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
Django后台admin的使用详解
Jul 08 Python
Python 处理文件的几种方式
Aug 23 Python
python编写计算器功能
Oct 25 Python
基于Python模拟浏览器发送http请求
Nov 06 Python
使用Python+Appuim 清理微信的方法
Jan 26 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 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面向对象程序设计类的定义与用法简单示例
2016/12/27 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
python数值基础知识浅析
2019/11/19 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
毕业生自我推荐
2013/11/04 职场文书
音乐学个人的自荐书范文
2013/11/26 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
诚信高考倡议书
2019/06/24 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
Python实现视频中添加音频工具详解
2021/12/06 Python