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 元类使用说明
Dec 18 Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
python中函数传参详解
Jul 03 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
Python3.6.x中内置函数总结及讲解
Feb 22 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
python线程中的同步问题及解决方法
Aug 29 Python
Django框架创建项目的方法入门教程
Nov 04 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
python反编译教程之2048小游戏实例
Mar 03 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
php session_start()出错原因分析及解决方法
2013/10/28 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
2018/04/09 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
JS实现DIV高度自适应窗口示例
2017/02/16 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
微信小程序实现全国机场索引列表
2018/01/31 Javascript
js html实现计算器功能
2018/11/13 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
Vue中util的工具函数实例详解
2019/07/08 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
通过Python 接口使用OpenCV的方法
2018/04/02 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
python如何实现数据的线性拟合
2019/07/19 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
Python Merge函数原理及用法解析
2020/09/16 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
外科实习自我鉴定
2013/10/06 职场文书
仓库理货员岗位职责
2013/12/18 职场文书
机械专业技术员求职信
2014/06/14 职场文书
工作求职信
2014/07/04 职场文书
承租经营合作者协议书
2014/10/01 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
background-position百分比原理详解
2021/05/08 HTML / CSS
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript