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多层嵌套list的递归处理方法(推荐)
Jun 08 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
python、java等哪一门编程语言适合人工智能?
Nov 13 Python
python保存数据到本地文件的方法
Jun 23 Python
Django重置migrations文件的方法步骤
May 01 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
Python中实现输入一个整数的案例
May 03 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
python os.listdir()乱码解决方案
Jan 31 Python
python wsgiref源码解析
Feb 06 Python
python操作xlsx格式文件并读取
Jun 02 Python
Python实现双向链表
May 25 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.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
解析isset与is_null的区别
2013/08/09 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
laravel学习教程之关联模型
2016/07/30 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
JavaScript 格式字符串的应用
2010/03/29 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
ReactNative踩坑之配置调试端口的解决方法
2017/07/28 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
Python flask框架post接口调用示例
2019/07/03 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
毕业生如何写自我鉴定
2014/03/15 职场文书
房屋转让协议书
2014/04/11 职场文书
公司活动总结怎么写
2014/06/25 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
教师反邪教心得体会
2016/01/15 职场文书