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中的wxPython实现最基本的浏览器功能
Apr 14 Python
Python使用email模块对邮件进行编码和解码的实例教程
Jul 01 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
Python设计模式之桥接模式原理与用法实例分析
Jan 10 Python
Python元组知识点总结
Feb 18 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
Feb 27 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
pytorch SENet实现案例
Jun 24 Python
关于python中remove的一些坑小结
Jan 04 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
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
解析coreseek for sphinx的使用
2013/06/21 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
js switch case default 的用法示例介绍
2013/10/23 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
Python中的类与类型示例详解
2019/07/10 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
2020/04/13 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
体育专业个人求职信范文
2013/12/27 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
社团招新宣传语
2015/07/13 职场文书
Nginx反向代理学习实例教程
2021/10/24 Servers