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 网络编程起步(Socket发送消息)
Sep 06 Python
python实现获取客户机上指定文件并传输到服务器的方法
Mar 16 Python
解决pandas使用read_csv()读取文件遇到的问题
Jun 15 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
Jun 28 Python
python实现多进程通信实例分析
Sep 01 Python
centos7中安装python3.6.4的教程
Dec 11 Python
python wxpython 实现界面跳转功能
Dec 17 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
python 使用三引号时容易犯的小错误
Oct 21 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中的string类型使用说明
2010/07/27 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
thinkphp缓存技术详解
2014/12/09 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
JavaScript 基础问答三
2008/12/03 Javascript
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
教你如何在Node.js中使用jQuery
2016/08/28 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
Python实现上下文管理器的方法
2020/08/07 Python
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
教师业务培训方案
2014/05/01 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
司机岗位职责范本
2015/04/10 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电