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程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
python查看FTP是否能连接成功的方法
Jul 30 Python
浅谈python中set使用
Jun 30 Python
python中正则的使用指南
Dec 04 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
python3之模块psutil系统性能信息使用
May 30 Python
python requests 测试代理ip是否生效
Jul 25 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
Django使用rest_framework写出API
May 21 Python
Django一小时写出账号密码管理系统
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
PHP4之真OO
2006/10/09 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
php实现短信发送代码
2015/07/05 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
使用js获取地址栏参数的方法推荐(超级简单)
2016/06/14 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
医学生自我评价
2014/01/27 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
意向书范本
2014/07/29 职场文书
化验室安全管理制度
2015/08/06 职场文书
利用Python实现模拟登录知乎
2022/05/25 Python