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爬虫教程之爬取百度贴吧并下载的示例
Mar 07 Python
Python中的pass语句使用方法讲解
May 14 Python
在Python中操作字典之fromkeys()方法的使用
May 21 Python
Python 探针的实现原理
Apr 23 Python
Python网络爬虫项目:内容提取器的定义
Oct 25 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 Python
对python文件读写的缓冲行为详解
Feb 13 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
Jul 19 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
May 19 Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
python3中TQDM库安装及使用详解
Nov 18 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
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
JS实现点击下载的小例子
2013/07/10 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
Python3基础之输入和输出实例分析
2014/08/18 Python
python通过cookie模拟已登录状态的初步研究
2016/11/09 Python
深入理解Python对Json的解析
2017/02/14 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
python 自定义对象的打印方法
2019/01/12 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
如何基于python实现脚本加密
2019/12/28 Python
Python txt文件如何转换成字典
2020/11/03 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
大学生毕业求职自荐书范文
2014/02/04 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
2014年接待工作总结
2014/11/26 职场文书
党员自评材料范文
2014/12/17 职场文书
介绍信格式样本
2015/05/05 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript