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计算一个文件里字数的方法
Jun 15 Python
Python制作简单的网页爬虫
Nov 22 Python
解决uWSGI的编码问题详解
Mar 24 Python
python 实现UTC时间加减的方法
Dec 31 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
python环境路径配置以及命令行运行脚本
Apr 02 Python
关于python中密码加盐的学习体会小结
Jul 15 Python
Python socket模块方法实现详解
Nov 05 Python
python构造IP报文实例
May 05 Python
Django扫码抽奖平台的配置过程详解
Jan 14 Python
python基础之//、/与%的区别详解
Jun 10 Python
Django框架中视图的用法
Jun 10 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源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
2007/04/20 Javascript
extjs fckeditor集成代码
2009/05/10 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
JS实现购物车特效
2017/02/02 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
图片懒加载imgLazyLoading.js使用详解
2020/09/15 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
Python批量按比例缩小图片脚本分享
2015/05/21 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
基于Python的OCR实现示例
2020/04/03 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
股权转让协议书
2014/04/12 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
冰雪公主观后感
2015/06/16 职场文书
信用卡工资证明范本
2015/06/19 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
解析Java中的static关键字
2021/06/14 Java/Android