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内建数据结构详解
Feb 03 Python
Python实现破解12306图片验证码的方法分析
Dec 29 Python
Python中的函数式编程:不可变的数据结构
Oct 08 Python
pandas使用apply多列生成一列数据的实例
Nov 28 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
Python 实现大整数乘法算法的示例代码
Sep 17 Python
python实现超市管理系统(后台管理)
Oct 25 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
jupyter note 实现将数据保存为word
Apr 14 Python
10行Python代码实现Web自动化管控的示例代码
Aug 14 Python
Python 实现微信自动回复的方法
Sep 11 Python
python里glob模块知识点总结
Jan 05 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动态图像的创建
2006/10/09 PHP
php代码把全角数字转为半角数字
2007/12/10 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
PHP常用技巧汇总
2016/03/04 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
使用js dom和jquery分别实现简单增删改
2014/09/11 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
Python函数的周期性执行实现方法
2016/08/13 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
python实现给微信指定好友定时发送消息
2019/04/29 Python
Django如何将URL映射到视图
2019/07/29 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
keras 多gpu并行运行案例
2020/06/10 Python
keras得到每层的系数方式
2020/06/15 Python
python实现AdaBoost算法的示例
2020/10/03 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
客房主管岗位职责
2013/12/09 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
Pytorch中expand()的使用(扩展某个维度)
2022/07/15 Python