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使用multiprocessing创建进程的方法
Jun 04 Python
python 捕获shell脚本的输出结果实例
Jan 04 Python
Python编写Windows Service服务程序
Jan 04 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
Django REST框架创建一个简单的Api实例讲解
Nov 05 Python
Python实现点云投影到平面显示
Jan 18 Python
Python Tornado核心及相关原理详解
Jun 24 Python
简单了解python关键字global nonlocal区别
Sep 21 Python
python实现图像随机裁剪的示例代码
Dec 10 Python
简单介绍Python的第三方库yaml
Jun 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
PHP 数组实例说明
2008/08/18 PHP
php数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
php操作redis命令及代码实例大全
2020/11/19 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
详解redis在nodejs中的应用
2018/05/02 NodeJs
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
Vue实现图片与文字混输效果
2019/12/04 Javascript
Python搭建FTP服务器的方法示例
2018/01/19 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
计算机毕业大学生推荐信
2013/12/01 职场文书
后勤主管工作职责
2013/12/07 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
贫困生证明范文
2015/06/16 职场文书
apache基于端口创建虚拟主机的示例
2021/04/22 Servers
python实现黄金分割法的示例代码
2021/04/28 Python
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏