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持久性管理pickle模块详细介绍
Feb 18 Python
python出现"IndentationError: unexpected indent"错误解决办法
Oct 15 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
Apr 03 Python
详解Django定时任务模块设计与实践
Jul 24 Python
详解Python3 pandas.merge用法
Sep 05 Python
python中树与树的表示知识点总结
Sep 14 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
python上selenium的弹框操作实现
Jul 13 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自动识别字符集并完成转码详解
2013/08/02 PHP
PHP调用其他文件中的类
2018/04/02 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
vue项目中实现图片预览的公用组件功能
2018/10/26 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
在layui框架中select下拉框监听更改事件的例子
2019/09/20 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
Python中matplotlib中文乱码解决办法
2017/05/12 Python
机器学习python实战之决策树
2017/11/01 Python
python实现输入数字的连续加减方法
2018/06/22 Python
python判断数字是否是超级素数幂
2018/09/27 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
python脚本后台执行方式
2019/12/21 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
什么是servlet链?
2014/07/13 面试题
移动通信行业实习自我鉴定
2013/09/28 职场文书
应届生高等护理求职信
2013/10/12 职场文书
销售简历自我评价
2014/01/24 职场文书
设计师求职信
2014/07/01 职场文书
展览会邀请函
2015/02/02 职场文书
安全教育片观后感
2015/06/17 职场文书
个人更名证明
2015/06/23 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
python实现的人脸识别打卡系统
2021/05/08 Python
nginx安装以及配置的详细过程记录
2021/09/15 Servers
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL