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 os模块介绍
Nov 30 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
浅谈sklearn中predict与predict_proba区别
Jun 28 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
简单的命令查看安装的python版本号
Aug 28 Python
Python常用数字处理基本操作汇总
Sep 10 Python
python实现发送带附件的邮件代码分享
Sep 22 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遍历数组的方法汇总
2015/04/30 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
2017/12/28 Javascript
vue内置指令详解
2018/04/03 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
Flask之pipenv虚拟环境的实现
2019/11/26 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
django迁移文件migrations的实现
2020/03/31 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
UNIX文件类型
2013/08/29 面试题
特色蛋糕店创业计划书
2014/01/28 职场文书
四年级下册教学反思
2014/02/01 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
信息员培训方案
2014/06/12 职场文书
好的旅游活动方案
2014/08/19 职场文书
优秀党支部申报材料
2014/12/24 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
质检员岗位职责范本
2015/04/07 职场文书
企业员工辞职信范文
2015/05/12 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS