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装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
Python3 replace()函数使用方法
Mar 19 Python
使用Python处理Excel表格的简单方法
Jun 07 Python
详解python3中zipfile模块用法
Jun 18 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
利用Python如何批量更新服务器文件
Jul 29 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
python实现雪花飘落效果实例讲解
Jun 18 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
在keras下实现多个模型的融合方式
May 23 Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 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数组是否为空的代码
2011/09/08 PHP
php数组去重的函数代码
2013/02/03 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
如何在PHP中读写文件
2020/09/07 PHP
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
js change,propertychange,input事件小议
2011/12/20 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
JavaScript闭包详解
2015/02/02 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
ES6 class的应用实例分析
2019/06/27 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
django加载本地html的方法
2018/05/27 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
Python global全局变量函数详解
2018/09/18 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
python判断是空的实例分享
2020/07/06 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
临床医师专业个人自我评价范文
2013/11/07 职场文书
学校十一活动方案
2014/02/01 职场文书
优秀毕业生就业推荐信
2014/05/22 职场文书
服装设计专业自荐信
2014/06/17 职场文书
任命书标准格式
2015/03/02 职场文书
死亡诗社观后感
2015/06/05 职场文书
MySQL去除密码登录告警的方法
2022/04/20 MySQL