Python自定义装饰器原理与用法实例分析


Posted in Python onJuly 16, 2018

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

什么是装饰器?装饰器本质是一个函数,它可以在不改变原来的函数的基础上额外的增加一些功能。如常见的@classmethod,@staticmethod等都是装饰器,接下来记录下如何自定义个装饰器:

刚刚说过了,装饰器的本质就是一个函数,所有想要自定义一个装饰器,首先自定义一个函数

def decorate(func):
  def wrapper(*args,**kwargs):
    print("定义一个装饰器")
    func(*args,**kwargs)
  return wrapper

此时就已经定义好了一个基本的装饰器,那该如何调用呢?

@decorate
def text1():
  print("text1")
text1()

输出的结果为:

定义一个装饰器
text1

分析:此时的@decorate相当于将text1函数的内存地址传入decorate函数,并返回wrapper函数的内存地址。因此在代码结尾中调用text1()本质上是执行wrapper函数。因为执行的是wrapper函数,所以会打印”定义一个装饰器”,又因为func函数是text1的内存地址,所以调用func,会打印”text1”。

带参数的装饰器

上面介绍了一个简单的装饰器如何定义,可是我们常常看到一个装饰器@xxxxxxx(abc="python"),这种装饰器是如何封装的,原理又是怎么样的呢

def decorate(name):
  def wrapper(func):
    def sub_wrapper(*args,**kwargs):
      print("定义一个带参数的装饰器",name)
      func(*args,**kwargs)
    return sub_wrapper  
  return wrapper
@decorate(name="python")
def text1():
  print("text1")
text1()

输出结果:

定义一个带参数的装饰器 python
text1

分析:带参数的装饰器与普通的装饰器多加了一层,其实就是讲“python”参数传入decorate函数,并返回wrapper函数的内存地址,再将text1函数内存地址传入wrapper函数,并返回了sub_wrapper函数的内存地址。而在代码末尾调用text1,其实本质是调用了sub_wrapper函数。

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

Python 相关文章推荐
python使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 Python
pandas分别写入excel的不同sheet方法
Dec 11 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
python爬虫增加访问量的方法
Aug 22 Python
python+selenium 点击单选框-radio的实现方法
Sep 03 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
Oct 25 Python
jupyter 导入csv文件方式
Apr 21 Python
Django serializer优化类视图的实现示例
Jul 16 Python
python 正确保留多位小数的实例
Jul 16 #Python
浅谈Python里面小数点精度的控制
Jul 16 #Python
详解Django中间件执行顺序
Jul 16 #Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 #Python
python 不以科学计数法输出的方法
Jul 16 #Python
Django配置celery(非djcelery)执行异步任务和定时任务
Jul 16 #Python
Python中的Django基本命令实例详解
Jul 15 #Python
You might like
php实现图片上传并进行替换操作
2016/03/15 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
JavaScript Promise启示录
2014/08/12 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
使用vue2.0创建的项目的步骤方法
2018/09/25 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
彻底理解Python list切片原理
2017/10/27 Python
用pandas按列合并两个文件的实例
2018/04/12 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
numpy.random模块用法总结
2019/05/27 Python
python中time库的实例使用方法
2019/10/31 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
adidas官方旗舰店:德国运动用品制造商
2017/11/25 全球购物
.NET面试10题
2014/02/24 面试题
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
军校本科大学生自我评价
2014/01/14 职场文书
行政助理的岗位职责
2014/02/18 职场文书
简单租房协议书
2014/04/09 职场文书
实习评语大全
2014/04/26 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
未婚证明范本
2015/06/15 职场文书