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 06 Python
python中cPickle用法例子分享
Jan 03 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
Python global全局变量函数详解
Sep 18 Python
详解Python with/as使用说明
Dec 13 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
Python实现通过解析域名获取ip地址的方法分析
May 17 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
Python自然语言处理之切分算法详解
Apr 25 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 数组基本操作方法详解
2016/06/17 PHP
PHP中文字符串截断无乱码解决方法
2016/10/10 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
JavaScript实现区块链
2018/03/14 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
Python常用内置函数总结
2015/02/08 Python
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
django中send_mail功能实现详解
2018/02/06 Python
详解django.contirb.auth-认证
2018/07/16 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
Python hashlib模块的使用示例
2020/10/09 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
军训自我鉴定
2013/12/14 职场文书
师德师风承诺书
2014/05/23 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python