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 itertools模块详解
May 09 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
python版大富翁源代码分享
Nov 19 Python
详解python项目实战:模拟登陆CSDN
Apr 04 Python
Python 离线工作环境搭建的方法步骤
Jul 29 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
Python字典中的值为列表或字典的构造实例
Dec 16 Python
python cv2截取不规则区域图片实例
Dec 21 Python
Python实现搜索算法的实例代码
Jan 02 Python
pytorch实现mnist分类的示例讲解
Jan 10 Python
python实现字符串和数字拼接
Mar 02 Python
python实现文件分片上传的接口自动化
Nov 19 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中根据变量的类型 选择echo或dump
2012/07/05 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
浅谈PHP的反射机制
2016/12/15 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
javascript EXCEL 操作类代码
2009/07/30 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
JavaScript 中使用 Generator的方法
2017/12/29 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
node后端服务保活的实现
2019/11/10 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
python人民币小写转大写辅助工具
2018/06/20 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
python如何进入交互模式
2020/07/06 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
大学生的应聘自我评价
2013/12/13 职场文书
车间统计员岗位职责
2014/01/05 职场文书
安全生产汇报材料
2014/02/17 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
家长会标语
2014/06/24 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python