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字符串逐字符或逐词反转方法
May 21 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
浅析Python基础-流程控制
Mar 18 Python
python导入时小括号大作用
Jan 10 Python
python中字符串比较使用is、==和cmp()总结
Mar 18 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
python自动化测试之如何解析excel文件
Jun 27 Python
python递归下载文件夹下所有文件
Aug 31 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
使用Python提取文本中含有特定字符串的方法示例
Dec 09 Python
详解Python牛顿插值法
May 11 Python
python数字图像处理之图像的批量处理
Jun 28 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
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
php实现webservice实例
2014/11/06 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
使用python实现个性化词云的方法
2017/06/16 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
python如何实现异步调用函数执行
2019/07/08 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
Python自动创建Excel并获取内容
2020/09/16 Python
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
九年级化学教学反思
2014/01/28 职场文书
珠宝店促销方案
2014/03/21 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis