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中的yield浅析
Jun 16 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
python文件写入write()的操作
May 14 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
Python多线程爬取豆瓣影评API接口
Oct 22 Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 Python
Python文件操作函数用法实例详解
Dec 24 Python
Python变量作用域LEGB用法解析
Feb 04 Python
基于python检查SSL证书到期情况代码实例
Apr 04 Python
Python使用socket模块实现简单tcp通信
Aug 18 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 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
图解上海144收音机
2021/03/02 无线电
PHPMailer安装方法及简单实例
2008/11/25 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
jQuery 幻灯片插件(带缩略图功能)
2011/01/24 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
2016/05/07 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
wxpython 学习笔记 第一天
2009/02/09 Python
Python写入CSV文件的方法
2015/07/08 Python
Python中str.format()详解
2017/03/12 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python可视化实现代码
2019/01/15 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
python读写csv文件实例代码
2019/07/05 Python
浅析Python requests 模块
2020/10/09 Python
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
美工的岗位职责
2013/11/14 职场文书
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
留学生如何写好自荐信
2013/12/27 职场文书
2014年保密工作总结
2014/11/22 职场文书
公务员考察材料范文
2014/12/23 职场文书
初中语文教学研修日志
2015/11/13 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers
使用javascript解析二维码的三种方式
2021/11/11 Javascript