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中from module import * 的一个坑
Jul 20 Python
python通过yield实现数组全排列的方法
Mar 18 Python
在Python中使用PIL模块处理图像的教程
Apr 29 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
tensorflow中next_batch的具体使用
Feb 02 Python
python代码过长的换行方法
Jul 19 Python
python实现感知器算法(批处理)
Jan 18 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
python判断变量是否为列表的方法
Sep 17 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 Python
Python matplotlib可视化之绘制韦恩图
Feb 24 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+DBM的同学录程序(1)
2006/10/09 PHP
笑谈配置,使用Smarty技术
2007/01/04 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
几个实用的PHP内置函数使用指南
2014/11/27 PHP
php实现zip文件解压操作
2015/11/03 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
js中有关IE版本检测
2012/01/04 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
幼师自我鉴定
2014/02/01 职场文书
总经理的岗位职责
2014/02/23 职场文书
王老吉广告词
2014/03/20 职场文书
美术教师个人总结
2015/02/06 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
小数乘法教学反思
2016/02/22 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS