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中的hashlib和base64加密模块使用实例
Sep 02 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
python 查找文件名包含指定字符串的方法
Jun 05 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
Python实现某论坛自动签到功能
Aug 20 Python
Django之路由层的实现
Sep 09 Python
python制作英语翻译小工具代码实例
Sep 09 Python
TensorFLow 变量命名空间实例
Feb 11 Python
python requests.get带header
May 05 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
详解python第三方库的安装、PyInstaller库、random库
Mar 03 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
十天学会php之第一天
2006/10/09 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
一句话JavaScript表单验证代码
2009/08/02 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
Angular工具方法学习
2016/12/26 Javascript
JS实现复制内容到剪贴板功能
2017/02/05 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
python网络编程学习笔记(一)
2014/06/09 Python
python实现查询IP地址所在地
2015/03/29 Python
python实现的文件同步服务器实例
2015/06/02 Python
python简单判断序列是否为空的方法
2015/06/30 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
python元组的概念知识点
2019/11/19 Python
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
办公室年终个人自我评价
2013/10/28 职场文书
婚礼答谢礼品
2015/01/20 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
python manim实现排序算法动画示例
2022/08/14 Python