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 20 Python
Python while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
详解Django中的过滤器
Jul 16 Python
Python导出DBF文件到Excel的方法
Jul 25 Python
Python环境搭建之OpenCV的步骤方法
Oct 20 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
用python打印菱形的实操方法和代码
Jun 25 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 Python
python制作抽奖程序代码详解
Jan 15 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根据两点间的经纬度计算距离
2014/10/31 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
Jquery遍历checkbox获取选中项value值的方法
2014/02/13 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
Python压缩和解压缩zip文件
2015/02/14 Python
整理Python中的赋值运算符
2015/05/13 Python
python使用super()出现错误解决办法
2017/08/14 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
python退出循环的方法
2020/06/18 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
shallow copy和deep copy的区别
2016/05/09 面试题
在校学生职业规划范文
2014/01/08 职场文书
给民警的表扬信
2014/01/08 职场文书
问卷调查计划书
2014/01/10 职场文书
幼儿园端午节活动方案
2014/08/25 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
2015中学学校工作总结
2015/07/20 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB