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 相关文章推荐
详解Django缓存处理中Vary头部的使用
Jul 24 Python
Python 12306抢火车票脚本
Feb 07 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
Python中的引用知识点总结
May 20 Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 Python
python程序 创建多线程过程详解
Sep 23 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
Jun 04 Python
Python制作数据预测集成工具(值得收藏)
Aug 21 Python
Python 列表推导式需要注意的地方
Oct 23 Python
利用python绘制正态分布曲线
Jan 04 Python
在Python中如何使用yield
Jun 07 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自动加载的两种实现方法
2010/06/21 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
javascript iframe编程相关代码
2009/12/28 Javascript
jQuery asp.net 用json格式返回自定义对象
2010/04/07 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
jQuery实现雪花飘落效果
2020/08/02 jQuery
Python之eval()函数危险性浅析
2014/07/03 Python
Python实现购物车功能的方法分析
2017/11/10 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
TensorFlow实现Logistic回归
2018/09/07 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
英国户外玩具儿童游乐设备网站:TP Toys(蹦床、攀爬框架、秋千、滑梯和游戏屋)
2018/04/09 全球购物
影视动画专业个人的自我评价
2013/12/31 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
收款授权委托书
2014/10/02 职场文书