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实现多线程下载文件的代码实例
Jun 01 Python
浅谈Python中的私有变量
Feb 28 Python
python如何使用unittest测试接口
Apr 04 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
python dict 相同key 合并value的实例
Jan 21 Python
Python实现京东秒杀功能代码
May 16 Python
简单了解Python matplotlib线的属性
Jun 29 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
带你学习Python如何实现回归树模型
Jul 16 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 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浮点比较大小的方法
2016/02/14 PHP
php上传图片类及用法示例
2016/05/11 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
根据经纬度计算地球上两点之间的距离js实现代码
2013/03/05 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
简单实现python收发邮件功能
2018/01/05 Python
Python中常用的内置方法
2019/01/28 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
什么是事务?事务有哪些性质?
2012/03/11 面试题
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
广州盈通面试题
2015/12/05 面试题
品学兼优的大学生自我评价
2013/09/20 职场文书
初中三年学生的学习自我评价
2013/11/13 职场文书
迎元旦广播稿
2014/02/22 职场文书
女方离婚起诉书
2015/05/18 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
Python基础之进程详解
2021/05/21 Python
anaconda python3.8安装后降级
2021/06/11 Python
Python turtle编写简单的球类小游戏
2022/03/31 Python