Python装饰器原理与基本用法分析


Posted in Python onJanuary 07, 2020

本文实例讲述了Python装饰器原理与基本用法。分享给大家供大家参考,具体如下:

装饰器:

意义:在不能改变原函数的源代码,和在不改变整个项目中原函数的调用方式的情况下,给函数添加新的功能

由于不允许改变函数的源代码,在忽略调用方式的情况下,我们可能会有以下结果:

def decorator(func):
  func()
  print("logging")
def test1():
  print("test1")
def test2():
  print("Test2")
decorator(test1)
decorator(test2)

但这改变了原本的调用方式,原本是test1(),现在是decorator(test1)

那么如果我们为了使调用方式不变,是否可以使装饰好的函数decorator的返回值是一个我们需要的函数,再赋值给原来的函数名呢?

于是:

def timmer1(func):
  def warpper():
    start_time = time.time()
    func()
    stop_time=time.time()
    print("the func run time is %s"%(stop_time-start_time))
   return warpper
test3=timmer1(test3)

好像上面这段代码并没有改变原来的调用方式,调用原来的test3,相当于运行timmer1中的warpper

如果对于无参数的函数来说,上面的代码已经实现了我们的目的,但对于带参数的函数,上面的代码没有传入参数,所以仍然需要修改

于是:

def timmer2(func):
  def warpper(*args,**kwargs):
    start_time = time.time()
    func(*args,**kwargs)
    stop_time=time.time()
    print("the func run time is %s"%(stop_time-start_time))
  return warpper

在上上面的代码中,由于实质上,test3已经等于wrapper,所以可以直接使用,test3(参数)来传入参数,为了处理参数不确定数量问题,可以使用可变长度参数

上面代码还存在一个问题,无法获取原本函数中的返回值,那么我们还需要加上一些东西:

import time
def timmer2(func):
  def warpper(*args,**kwargs):
    start_time = time.time()
    res=func(*args,**kwargs)
    return res
    stop_time=time.time()
    print("the func run time is %s"%(stop_time-start_time))
  return warpper

使用一个变量记录下原函数的返回值。

这样我们就实现了装饰器的基本功能。

补充:

python提供了一个功能:

@装饰器名
def 目标装饰函数名():
  pass
#上面的效果是 目标装饰函数名=装饰器(目标装饰函数名)

所以在需要替换原函数的时候,可以在目标装饰函数定义的上一行加上@装饰器名

所以上面的代码会变成:

def timmer2(func):
  def warpper(*args,**kwargs):
    start_time = time.time()
    func(*args,**kwargs)
    stop_time=time.time()
    print("the func run time is %s"%(stop_time-start_time))
  return warpper
@timmer2
def test7():
  print("test7")
@timmer2
def test6(x):
  print(x)
test7()
test6(2)
import time
def timmer2(func):
  def warpper(*args,**kwargs):
    start_time = time.time()
    res=func(*args,**kwargs)
    return res
    stop_time=time.time()
    print("the func run time is %s"%(stop_time-start_time))
  return warpper
@timmer2
def test4():
  print("test4 run")
  return "test4 done"
test4()
print("--------")
print(test4())

第二个补充:

可以一个函数,可以使用多个装饰器

比如:

@装饰器1

@装饰器2

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python批量下载图片的三种方法
Apr 22 Python
关于你不想知道的所有Python3 unicode特性
Nov 28 Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 Python
Python实现类的创建与使用方法示例
Jul 25 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
python os.listdir按文件存取时间顺序列出目录的实例
Oct 21 Python
python 处理telnet返回的More,以及get想要的那个参数方法
Feb 14 Python
python文件写入write()的操作
May 14 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 Python
用python爬取历史天气数据的方法示例
Dec 30 Python
python爬虫中url管理器去重操作实例
Nov 30 Python
python保留小数位的三种实现方法
Jan 07 #Python
pytorch之ImageFolder使用详解
Jan 06 #Python
pytorch之inception_v3的实现案例
Jan 06 #Python
pytorch之添加BN的实现
Jan 06 #Python
PyTorch学习:动态图和静态图的例子
Jan 06 #Python
pytorch动态网络以及权重共享实例
Jan 06 #Python
selenium中get_cookies()和add_cookie()的用法详解
Jan 06 #Python
You might like
人大复印资料处理程序_补充篇
2006/10/09 PHP
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
js保存当前路径(cookies记录)
2010/12/14 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
使用console进行性能测试
2015/04/27 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
代码详解django中数据库设置
2019/01/28 Python
python图形绘制奥运五环实例讲解
2019/09/14 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
企业门卫岗位职责
2013/12/12 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
美术教师岗位职责
2014/03/18 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
初三学生个人自我评定
2014/04/06 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
《绝招》教学反思
2016/02/20 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL