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中使用lambda高效操作列表的教程
Apr 24 Python
python实现合并两个数组的方法
May 16 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
python numpy中cumsum的用法详解
Oct 17 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
使用Keras实现简单线性回归模型操作
Jun 12 Python
python如何实时获取tcpdump输出
Sep 16 Python
python中pdb模块实例用法
Jan 15 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
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
Smarty变量用法详解
2016/05/11 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
Javascript算符的优先级介绍
2013/03/20 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
2019/08/16 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
Python编程之多态用法实例详解
2015/05/19 Python
理解Python中的With语句
2016/03/18 Python
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
Python多进程multiprocessing.Pool类详解
2018/04/27 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
修改默认的pip版本为对应python2.7的方法
2018/11/06 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
Pygame框架实现飞机大战
2020/08/07 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
介绍一下Ruby的多线程处理
2013/02/01 面试题
财务会计专业求职信范文
2013/12/31 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
文明单位创建材料
2014/12/24 职场文书
交心谈心活动总结
2015/05/11 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python