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脚本实现查找webshell的方法
Jul 31 Python
讲解Python中的标识运算符
May 14 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
python版本的读写锁操作方法
Apr 25 Python
Python 将RGB图像转换为Pytho灰度图像的实例
Nov 14 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
caffe binaryproto 与 npy相互转换的实例讲解
Jul 09 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
如何基于python操作json文件获取内容
Dec 24 Python
Python爬虫工具requests-html使用解析
Apr 29 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作的文本留言本的例子(三)
2006/10/09 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
使用swoole扩展php websocket示例
2014/02/13 PHP
ThinkPHP分页类使用详解
2014/03/05 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
MSN消息提示类
2006/09/05 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
js实现简单的无缝轮播效果
2020/09/05 Javascript
答题辅助python代码实现
2018/01/16 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
python逆序打印各位数字的方法
2018/06/25 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
浅谈python锁与死锁问题
2020/08/14 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
html5绘制时钟动画
2014/12/15 HTML / CSS
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
纽约手袋品牌:KARA
2018/03/18 全球购物
五年级语文教学反思
2014/01/30 职场文书
教师节演讲稿
2014/05/06 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
国富论读书笔记
2015/06/26 职场文书
老人院义工活动感想
2015/08/07 职场文书