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之??碌某?? target=
Sep 12 Python
Python multiprocessing模块中的Pipe管道使用实例
Apr 11 Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
Python opencv实现人眼/人脸识别以及实时打码处理
Apr 29 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
python jenkins 打包构建代码的示例代码
Nov 29 Python
详解Python爬虫爬取博客园问题列表所有的问题
Jan 18 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函数解决SQL injection
2006/10/09 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
Yii框架表单模型和验证用法
2016/05/20 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
VUE中v-on:click事件中获取当前dom元素的代码
2018/08/22 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
对Python3中的input函数详解
2018/04/22 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
python实现日志按天分割
2019/07/22 Python
python中threading开启关闭线程操作
2020/05/02 Python
Python如何把字典写入到CSV文件的方法示例
2020/08/23 Python
Html5之title吸顶功能
2018/06/04 HTML / CSS
耐克亚太地区:Nike APAC
2019/12/07 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
八年级数学教学反思
2014/01/31 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
九年级语文教学反思
2016/03/03 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
python入门之算法学习
2021/04/22 Python