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 re正则表达式模块(Regular Expression)
Jul 16 Python
Python黑魔法@property装饰器的使用技巧解析
Jun 16 Python
python发送邮件功能实现代码
Jul 15 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
python dataframe 输出结果整行显示的方法
Jun 14 Python
对Django外键关系的描述
Jul 26 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 Python
基于python爬取有道翻译过程图解
Mar 31 Python
Python实现AI换脸功能
Apr 10 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
详解python中的异常和文件读写
Jan 03 Python
python多次执行绘制条形图
Apr 20 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开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
推荐dojo学习笔记
2007/03/24 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
python使用wxpython开发简单记事本的方法
2015/05/20 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
深入浅出学习python装饰器
2017/09/29 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
python3 发送任意文件邮件的实例
2018/01/23 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
总会计师岗位职责
2014/02/19 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
亮剑观后感300字
2015/06/05 职场文书
人间正道是沧桑观后感
2015/06/15 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS