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的setuptools框架下生成egg的教程
Apr 13 Python
简述Python中的面向对象编程的概念
Apr 27 Python
利用Python学习RabbitMQ消息队列
Nov 30 Python
基于python实现微信模板消息
Dec 21 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
Django csrf 验证问题的实现
Oct 09 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
总结三种用 Python 作为小程序后端的方式
May 02 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 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
Prototype使用指南之range.js
2007/01/10 Javascript
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
python查找目录下指定扩展名的文件实例
2015/04/01 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
Python对List中的元素排序的方法
2018/04/01 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
python实现翻译word表格小程序
2020/02/27 Python
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
安全检查验收制度
2014/01/12 职场文书
工作失误检讨书范文
2015/01/26 职场文书
2016年春节慰问信息
2015/03/25 职场文书
医院病假条范文
2015/08/17 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书