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操作列表之List.insert()方法的使用
May 20 Python
python相似模块用例
Mar 04 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
python3实现读取chrome浏览器cookie
Jun 19 Python
Python常用时间操作总结【取得当前时间、时间函数、应用等】
May 11 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
Python实现的根据IP地址计算子网掩码位数功能示例
May 23 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
python+os根据文件名自动生成文本
Mar 21 Python
Python + Flask 实现简单的验证码系统
Oct 01 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
python中tab键是什么意思
Jun 18 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
YB217、YB235、YB400浅听
2021/03/02 无线电
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
javascript 定义初始化数组函数
2009/09/07 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
javascript 寻找错误方法整理
2014/06/15 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
python实现telnet客户端的方法
2015/04/15 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
综合内勤岗位职责
2014/04/14 职场文书
《画风》教学反思
2014/04/16 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
初中英语演讲稿
2014/04/29 职场文书
详解Golang如何优雅的终止一个服务
2022/03/21 Golang
Vue+Flask实现图片传输功能
2022/04/01 Vue.js