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完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
python实现爬虫下载美女图片
Jul 14 Python
Python微信公众号开发平台
Jan 25 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
python 实现语音聊天机器人的示例代码
Dec 02 Python
python序列化与数据持久化实例详解
Dec 20 Python
Python numpy多维数组实现原理详解
Mar 10 Python
Python求凸包及多边形面积教程
Apr 12 Python
Spring http服务远程调用实现过程解析
Jun 11 Python
win10安装python3.6的常见问题
Jul 01 Python
如何在python中实现线性回归
Aug 10 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
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
php 文件上传类代码
2011/08/06 PHP
php 批量替换程序的具体实现代码
2013/10/04 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
表单内同名元素的控制
2006/11/22 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
JavaScript模拟push
2016/03/06 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
Win8下python3.5.1安装教程
2020/07/29 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Python中and和or如何使用
2020/05/28 Python
python处理写入数据代码讲解
2020/10/22 Python
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
高一英语教学反思
2014/01/22 职场文书
酒店销售经理岗位职责
2014/01/31 职场文书
孔庙导游词
2015/02/04 职场文书
城南旧事读书笔记
2015/06/29 职场文书
车辆挂靠协议书
2016/03/23 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
python机器学习实现oneR算法(以鸢尾data为例)
2022/03/03 Python