python装饰器三种装饰模式的简单分析


Posted in Python onSeptember 04, 2020

学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了!

这里就简单讨论下python的几种装饰模式:

一 无参装饰器:

# 装饰器
import time
 
 
# 装饰器,记录函数运行时间
def decorator01(fun):
 def wapper():
  stime = time.time()
  fun()
  etime = time.time()
  print("fun run time is {TIME}".format(TIME=etime - stime))
 return wapper # 必须要返回一个函数的内存地址
 
 
# 使用装饰器装饰某个函数,等价于 test01=decorator01(test01),
# 即将test01实际引用变成wapper函数内存地址,所以执行test01实际是执行wapper
@decorator01
def test01():
 time.sleep(2)
 print("test01 is running")
 
 
test01() # 不修改代码和调用方式,实现添加记录时间功能

二 函数带参装饰器:

# 装饰器
import time
 
 
# 装饰器,记录函数运行时间
def decorator01(fun):
 def wapper(*args, **kwargs): # 使用非固定参数,无论参数是什么,都可以传递进来
  stime = time.time()
  fun(*args, **kwargs)
  etime = time.time()
  print("fun run time is {TIME}".format(TIME=etime - stime))
 return wapper # 必须要返回一个函数的内存地址
 
 
# test01() = wapper(), 所以装饰器加参数是给嵌套函数加参数
@decorator01
def test01(args1):
 time.sleep(2)
 print("参数是 {NAME} ".format(NAME=args1))
 
 
test01("侯征") # 不修改代码和调用方式,实现添加记录时间功能

三 装饰器本身带参数的装饰器:

# 装饰器
import time
 
 
# 如果装饰器有参数,最外层是装饰器的参数
def decorator01(*args, **kwargs):
 print("装饰器参数:", *args, **kwargs)
 def out(fun): #第二层才是接受的函数
  def wapper(*args, **kwargs): # 使用非固定参数,无论参数是什么,都可以传递进来
   stime = time.time()
   fun(*args, **kwargs)
   etime = time.time()
   print("fun run time is {TIME}".format(TIME=etime - stime))
 
  return wapper # 必须要返回一个函数的内存地址
 return out # 要返回装饰函数的内存地址
 
 
# 装饰器本身带参数,此时 decorator01(arg)=out,即相当于 @out装饰test01,所以 test01=out(fun)=wapper
@decorator01(1)
def test01(args1):
 time.sleep(2)
 print("参数是 {NAME} ".format(NAME=args1))
 
 
test01("侯征") # 不修改代码和调用方式,实现添加记录时间功能

这种一开始挺难理解的,但是只要记住一点,@语法糖装饰器的作用就是 给被装饰的函数重新赋一个函数的内存地址,即装饰器内部定义的那个

和你直接fun01=decorator(fun),然后 fun01()是一样的,只是这样写不用改变原来调用方式

@decorator

def fun():

即就是 fun=decorator(fun) 所以,当装饰器有参数时,还需要返回一个函数,这个函数才是用来装饰作用的, decorator(1)=out, 即 fun=out(fun) !!

所以外面再包一层就行了,其实就相当于@decorator(1)=@out,即 decorator(1)=out ,实际装饰器时out,只不过decorator(1)返回了一个out 这样理解就简单多了 ,无参的@就是起赋值作用

以上就是python装饰器三种装饰模式的简单分析的详细内容,更多关于python 装饰模式的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
Python实现将绝对URL替换成相对URL的方法
Jun 28 Python
Python最火、R极具潜力 2017机器学习调查报告
Dec 11 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
Python+matplotlib绘制不同大小和颜色散点图实例
Jan 19 Python
Python基于FTP模块实现ftp文件上传操作示例
Apr 23 Python
Python subprocess模块功能与常见用法实例详解
Jun 28 Python
python selenium 执行完毕关闭chromedriver进程示例
Nov 15 Python
tensorflow常用函数API介绍
Apr 19 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
Oct 27 Python
Python安装Bs4的多种方法
Nov 28 Python
Python 文字识别
May 11 Python
Django如何实现密码错误报错提醒
Sep 04 #Python
如何使用python socket模块实现简单的文件下载
Sep 04 #Python
python 监控logcat关键字功能
Sep 04 #Python
如何将json数据转换为python数据
Sep 04 #Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
Sep 04 #Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 #Python
学习Python需要哪些工具
Sep 04 #Python
You might like
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
jQuery语法总结和注意事项小结
2012/11/11 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
2019/01/23 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
Python GUI编程完整示例
2019/04/04 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
销售主管竞聘书
2014/03/31 职场文书
班级心理活动总结
2014/07/04 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
旷课检讨书范文
2014/10/30 职场文书
2014年城管工作总结
2014/11/20 职场文书
2014年市场部工作总结
2014/11/25 职场文书
银行稽核岗位职责
2015/04/13 职场文书
24年收藏2000多部退役军用电台
2022/02/18 无线电
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
Python正则表达式中flags参数的实例详解
2022/04/01 Python
SQL Server中锁的用法
2022/05/20 SQL Server