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连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
python连接MySQL数据库实例分析
May 12 Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 Python
使用Django和Python创建Json response的方法
Mar 26 Python
Python输入二维数组方法
Apr 13 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
华为校园招聘上机笔试题 扑克牌大小(python)
Apr 22 Python
Python 类的魔法属性用法实例分析
Nov 21 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
jupyter notebook参数化运行python方式
Apr 10 Python
Python使用plt.boxplot() 参数绘制箱线图
Jun 04 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 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
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
JS校验与最终登陆界面功能完整示例
2020/01/13 Javascript
python实现哈希表
2014/02/07 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
python下载微信公众号相关文章
2019/02/26 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
印度网上药店:1mg
2017/10/13 全球购物
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
中学生校园广播稿
2014/01/16 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android