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实现数通设备端口监控示例
Apr 02 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
Python实现的单向循环链表功能示例
Nov 10 Python
DataFrame中去除指定列为空的行方法
Apr 08 Python
python 按不同维度求和,最值,均值的实例
Jun 28 Python
flask入门之表单的实现
Jul 18 Python
一看就懂得Python的math模块
Oct 21 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
使用APScheduler3.0.1 实现定时任务的方法
Jul 22 Python
python滑块验证码的破解实现
Nov 10 Python
python获取网络图片方法及整理过程详解
Dec 20 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 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
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
JS使用JSON作为参数实例分析
2016/06/23 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
Python获取服务器信息的最简单实现方法
2015/03/05 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
python3 mmh3安装及使用方法
2019/10/09 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
Betsey Johnson官网:妖娆可爱的连衣裙及鞋子、手袋和配件
2016/12/30 全球购物
预备党员思想汇报范文
2014/01/11 职场文书
打造完美自荐信
2014/01/24 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
图书室标语
2014/06/21 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
2015大学生实训报告
2014/11/05 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
青岛导游词
2015/02/12 职场文书
采购员工作总结范文
2015/08/12 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python