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中二维阵列的变换实例
Oct 09 Python
github配置使用指南
Nov 18 Python
python实现在每个独立进程中运行一个函数的方法
Apr 23 Python
Python中操作符重载用法分析
Apr 29 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
Oct 11 Python
python的re模块使用方法详解
Jul 26 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
CentOS 7如何实现定时执行python脚本
Jun 24 Python
深入了解Python 方法之类方法 & 静态方法
Aug 17 Python
Python 正则模块详情
Nov 02 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 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按一定比例压缩图片的方法
2018/10/12 PHP
json 实例详细说明教程
2009/10/31 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
Vue实现数据请求拦截
2019/10/23 Javascript
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
python实现飞机大战微信小游戏
2020/03/21 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
python实现ip代理池功能示例
2019/07/05 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
后勤人员岗位职责
2013/12/17 职场文书
后进生转化工作制度
2014/01/17 职场文书
学徒工职责
2014/03/06 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
工地安全质量标语
2014/06/07 职场文书
中国梦团日活动总结
2014/07/07 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
工作自我评价范文
2019/03/21 职场文书