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 简易计算器程序,代码就几行
Aug 29 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
python构建自定义回调函数详解
Jun 20 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
python实现事件驱动
Nov 21 Python
python3使用matplotlib绘制散点图
Mar 19 Python
Python求离散序列导数的示例
Jul 10 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 Python
使用Puppeteer爬取微信文章的实现
Feb 11 Python
Python如何在DataFrame增加数值
Feb 14 Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
php_xmlhttp 乱码问题解决方法
2009/08/07 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
javascript 打印页面代码
2009/03/24 Javascript
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
Pandas数据离散化原理及实例解析
2019/11/16 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
大家检讨书5000字
2014/02/03 职场文书
借款协议书
2014/04/12 职场文书
经典演讲稿开场白
2014/08/25 职场文书
人事任命通知书
2015/04/21 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
Java的Object类的九种方法
2022/04/13 Java/Android