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之坑爹的字符编码
Sep 28 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
对Python 2.7 pandas 中的read_excel详解
May 04 Python
利用Python yagmail三行代码实现发送邮件
May 11 Python
把csv文件转化为数组及数组的切片方法
Jul 04 Python
使用Python为中秋节绘制一块美味的月饼
Sep 11 Python
python根据文本生成词云图代码实例
Nov 15 Python
Python嵌套函数,作用域与偏函数用法实例分析
Dec 26 Python
Python flask框架端口失效解决方案
Jun 04 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 Python
Django cookie和session的应用场景及如何使用
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 和 HTML
2006/10/09 PHP
php获得文件扩展名三法
2006/11/25 PHP
php 魔术函数使用说明
2010/02/21 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
JSF中confirm弹出框的用法示例介绍
2014/01/07 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
解析Python编程中的包结构
2015/10/25 Python
Python Requests 基础入门
2016/04/07 Python
Python构建XML树结构的方法示例
2017/06/30 Python
Python 字符串与数字输出方法
2018/07/16 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
家长评语和期望
2014/02/10 职场文书
党员争先创优承诺书
2015/01/20 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
咖啡厅里的创业计划书
2019/08/21 职场文书
分享几个实用的CSS代码块
2022/06/10 HTML / CSS