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写入中英文字符串到文件的方法
May 06 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
用python写一个带有gui界面的密码生成器
Nov 06 Python
python生成word合同的实例方法
Jan 12 Python
Pandas的数据过滤实现
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
PHP调用三种数据库的方法(2)
2006/10/09 PHP
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
destoon常用的安全设置概述
2014/06/21 PHP
PHP中防止SQL注入方法详解
2014/12/25 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
python ddt实现数据驱动
2018/03/14 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
python面向对象 反射原理解析
2019/08/12 Python
Python命令行click参数用法解析
2019/12/19 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
2020/03/12 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
海南地接欢迎词
2014/01/14 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
文字自荐书范文
2014/02/10 职场文书
个人廉洁自律承诺书
2014/03/27 职场文书
世界红十字日活动总结
2015/02/10 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
Elasticsearch 批量操作
2022/04/19 Python