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 25 Python
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
Python三级目录展示的实现方法
Sep 28 Python
python实现word 2007文档转换为pdf文件
Mar 15 Python
详解django中使用定时任务的方法
Sep 27 Python
深入理解Django自定义信号(signals)
Oct 15 Python
Python批量生成幻影坦克图片实例代码
Jun 04 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
Python使用re模块验证危险字符
May 21 Python
python进度条显示-tqmd模块的实现示例
Aug 23 Python
详解Pytorch显存动态分配规律探索
Nov 17 Python
10个示例带你掌握python中的元组
Nov 23 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往windows中添加用户
2006/12/06 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
查询json的数据结构的8种方式简介
2014/03/10 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
Vue shopCart 组件开发详解
2018/01/26 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
Python记录详细调用堆栈日志的方法
2015/05/05 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
利用python求积分的实例
2019/07/03 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
python 修改本地网络配置的方法
2019/08/14 Python
python十进制转二进制的详解
2020/02/07 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
html5通过canvas实现刮刮卡效果示例分享
2014/01/27 HTML / CSS
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
Black Halo官方网站:购买连衣裙、礼服和连体裤
2018/06/13 全球购物
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
专科毕业生学习生活的自我评价
2013/10/26 职场文书
化学专业毕业生自荐信
2013/11/15 职场文书
清洁工表扬信
2014/01/08 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
《神奇的克隆》教学反思
2014/04/10 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers