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读写ini配置文件方法实例分析
Jun 30 Python
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
Python常用知识点汇总
May 08 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
python实现微信发送邮件关闭电脑功能
Feb 22 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
基于Python实现签到脚本过程解析
Oct 25 Python
Python算法的时间复杂度和空间复杂度(实例解析)
Nov 19 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
理解python中装饰器的作用
Jul 21 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
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
js兼容标准的表格变色效果
2008/06/28 Javascript
JavaScript 学习点滴记录
2009/04/24 Javascript
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
js实现文字列表无缝滚动效果
2017/06/23 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
js+audio实现音乐播放器
2020/09/13 Javascript
Python使用gensim计算文档相似性
2016/04/10 Python
Python selenium如何设置等待时间
2016/09/15 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
两只小狮子教学反思
2014/02/05 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
2014学年自我鉴定
2014/02/23 职场文书
校庆接待方案
2014/03/18 职场文书
公司办公室岗位职责
2014/03/19 职场文书
法制报告会主持词
2014/04/02 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
政协常委会议主持词
2015/07/03 职场文书
Elasticsearch 数据类型及管理
2022/04/19 Python