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实现线程池代码分享
Jun 21 Python
使用PyCharm配合部署Python的Django框架的配置纪实
Nov 19 Python
Python函数中的函数(闭包)用法实例
Mar 15 Python
Python使用asyncio包处理并发详解
Sep 09 Python
python基础教程项目三之万能的XML
Apr 02 Python
修改默认的pip版本为对应python2.7的方法
Nov 06 Python
python实现手机销售管理系统
Mar 19 Python
详解python中各种文件打开模式
Jan 19 Python
python线程join方法原理解析
Feb 11 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
高考考python编程是真的吗
Jul 20 Python
Opencv 图片的OCR识别的实战示例
Mar 02 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 和 MySQL 时区的一点总结
2008/03/26 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
PHP异常处理Exception类
2015/12/11 PHP
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
node使用request请求的方法
2019/12/20 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
python机器学习之随机森林(七)
2018/03/26 Python
python读取和保存视频文件
2018/04/16 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
python装饰器原理与用法深入详解
2019/12/19 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
行政人事专员岗位职责
2014/03/05 职场文书
倡议书格式模板
2014/05/13 职场文书
土建施工员岗位职责
2014/07/16 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
心理健康教育主题班会
2015/08/13 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python