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抓取京东商城手机列表url实例代码
Dec 18 Python
Python入门之modf()方法的使用
May 15 Python
基于python内置函数与匿名函数详解
Jan 09 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 Python
分析经典Python开发工程师面试题
Apr 08 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
Python如何实现邮件功能
May 27 Python
Python计算信息熵实例
Jun 18 Python
Django项目创建及管理实现流程详解
Oct 13 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
手把手教你怎么用Python实现zip文件密码的破解
May 27 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
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
jQuery1.5.1 animate方法源码阅读
2011/04/05 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
[03:02]生活中的Dendi之野外度假篇
2016/08/09 DOTA
python进阶教程之词典、字典、dict
2014/08/29 Python
用python写的一个wordpress的采集程序
2016/02/27 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
python面试题之列表声明实例分析
2019/07/08 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
高中学生干部学习的自我评价
2014/02/21 职场文书
讲党性心得体会
2014/09/03 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
作文批改评语
2014/12/25 职场文书
写给医院的感谢信
2015/01/22 职场文书
信息技术课教学反思
2016/02/23 职场文书
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android