这是一篇关于python装饰器的博文

  在学习python的过程中处处受阻,之前的学习中Python的装饰器学习了好几遍也没能真正的弄懂。这一次抓住视频猛啃了一波,就连python大佬讲解装饰器起来也需要大半天的时间。据说是两个老师轮流讲解,还得吃药才能讲完。详情请见老男孩的第14期视频day4。

听完两位老师的讲解,我算是系统而又全面的理解了装饰器,并将其总结。

一、定义

  想要彻底的弄清楚装饰器,就得彻底的弄明白Python装饰器的定义,百科里的定义说:装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。之前的都是扯淡,具体的等深入后才能了解,我们目前只需要明白装饰器的作用就是为已经存在的对象添加额外的功能。

  简单来说,装饰器的作用就是给已经存在的函数附加功能。

二、原则

  做任何事都需要讲究原则。编写装饰器也需要按照相应的原则出现,如果不遵守其原则就不能算是装饰器。

  装饰器的原则:

      A、不能修改被装饰函数的源代码

      B、不能修改装饰器的函数的调用方式

图2.1需求

图2.2修改一

  如图2.2中的foo()函数。虽然实现了图2.1中所需求的功能,但是图2.2中的foo修改了代码,这便违反了装饰器原则一,不能称之为装饰器。

图2.3修改二

  如图2.3中的test()函数。它也实现了图2.1中所需求的功能,但是图2.3中需要调用test()函数才能实现其功能,这样就违反了原则二(如果程序中有一千个foo函数就得将这1000个foo全改成test),这么修改也不能称之为装饰器。

三、掌握装饰器所需的知识储备

  想要掌握python的装饰器,就得先掌握如下知识作为掌握装饰器成储备知识:

  1、函数即“变量”(一切皆对象)

  2、高阶函数

  3、嵌套函数

  只有掌握了这三个知识,才能掌握装饰器。

3.1 函数即“变量”(一切皆对象)

  在python中,一切皆对象(这就是为什么这么多屌丝来学python的原因)。变量是对象,函数是对象,类是对象,所有的一切都是对象。如图3.1所示,这里定义函数func,于是内存中就开辟属于func的内存空间,写入func的函数功能。随后在解释器上输入func函数的函数名,这时会返回一串指针地址,在python中所有的对象都会对应的指针地址,即指向内存中func函数的位置。如果在func函数名后加上(),这就说明func根据指针地址调用了func函数。

  如图,将func函数的变量名赋值给f,就是将func的内存地址赋值给f,f就会指向内存红func函数的位置。在解释器中输入f()时,就能调用对应地址的func函数。

图3.1一切皆对象

3.2高阶函数

  高阶函数即一个函数的函数名作为参数传入另一个函数。如图3.2所示。定义func函数有x,y,f三个参数,执行func函数时将实参abs(abs是求绝对值的内置函数)传形参f,func函数最后return两数的绝对值和。

图3.2高阶函数

3.3嵌套函数

  嵌套函数是在一个函数的函数体内声明一个函数,再调用

图3.3嵌套函数

四、装饰器初成

  如图4.1所示,这样写就能够实现图2.1中的需求,并且遵循了装饰器的两个原则。其中就涉及到了装饰器的三个储备知识,由此可见三个储备知识的重要性。

图4.1装饰器初成

  但是图4.1中的test只是刚好装饰没有返回值的函数,如图4.2则可以装饰存在返回值的函数。

图4.2装饰器初成修改

五、装饰器小成

  四中描述的装饰器还不够全面,如果函数foo需要传入参数时,图4.2中的装饰函数就会报错。于是这里就涉及到了函数的可变长参数和可变长关键字参数。这样就能实现任意的参数传入。于是装饰器的功法就小有所成了。如图5.1所示。

图5.1装饰器小成

六、装饰器大成

  其实装饰器学到五的时候,我就觉得已经很厉害了,想着自己终于弄懂了,但是老男孩里的alex老师有继续补充了一个关于装饰函数传参的知识点,突然间我就觉得这节课值500块,感谢Alex老师。老师最后的代码是这样的。这是一个模拟网站不同登陆方式的装饰器,使用一个装饰器,对不同的函数的附加不同的功能。Home函数使用密码登陆方式,bbs函数使用另一种登入方式(此处只是模拟一下),如图6.1所示。

图6.1装饰器大成

七、总结

  以上就是我学习装饰器之后对其的总结,根据上述内容,我绘制了一个概念图,便于对装饰器的理解和掌握。

一篇关于Python装饰器的博文的更多相关文章

  1. Python基础篇【第6篇】: Python装饰器

    装饰器 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类, ...

  2. Python之路【第七篇】:Python装饰器

    阅读目录 一.装饰器 1.装饰器的概念 #装饰器定义:本质就是函数,功能是为其他函数添加附加功能 二.装饰器需要遵循的原则 #原则: 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 装饰 ...

  3. Python 装饰器入门(上)

    翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...

  4. Python装饰器总结,带你几步跨越此坑!

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  5. 使用python装饰器计算函数运行时间的实例

    使用python装饰器计算函数运行时间的实例 装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是 ...

  6. python 装饰器 一篇就能讲清楚

    装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...

  7. 理解 Python 装饰器看这一篇就够了

    讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...

  8. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  9. 遥想大肠包小肠----python装饰器乱弹

    说起装饰器就tm蛋疼,在老男孩学习python装饰器,结果第二天默写,全错了,一道题抄十遍,共计二十遍. 要是装饰器是一人,我非要约他在必图拳馆来一场...... 下面容我展示一下默写二十遍的成果 语 ...

随机推荐

  1. bc计算A股上市新股依次涨停股价

    几年的股市可谓惨不忍睹,不提也罢.唯有打新中签的时候,心里稍微有那么一点点的补偿,于是内心就YY可以30板吗,可以40板吗.于是就写了个连板的bc程序,每次中签的时候就运行一下,然后尽情的YY,然而每 ...

  2. PHP数字价格格式化,保留两位小数

    number_format(($v['cash']/100),2); demo=>9,271.15

  3. (cljs/run-at (JSVM. :browser) "命名空间就这么简单")

    前言  一个cljs文件定义一个命名空间,通过命名空间可以有效组织代码,这是构建大型系统必备的基础设施.本篇我们就深入理解cljs中的命名空间吧! 好习惯从"头"开始 每个cljs ...

  4. MATLAB命令大全和矩阵操作大全

    转载自: http://blog.csdn.net/dengjianqiang2011/article/details/8753807 MATLAB矩阵操作大全 一.矩阵的表示在MATLAB中创建矩阵 ...

  5. Oracle数据库中的重要对象

    数据库中的重要对象:表.视图.序列.函数.存储过程.索引.同义词1.表:用PL/SQL Developer 软件打开 Scott的DEPT表查看SQL,可以看见DEPT表创建的脚本-- Create ...

  6. Docker 的两类存储资源 - 每天5分钟玩转 Docker 容器技术(38)

    我们从本章开始讨论 Docker 存储. Docker 为容器提供了两种存放数据的资源: 由 storage driver 管理的镜像层和容器层. Data Volume. 我们会详细讨论它们的原理和 ...

  7. java基础系列--Calendar类

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7136575.html 1.Calendar概述 Java官方推荐使用Calendar来替换 ...

  8. win7-x64安装mysql5.7.11(官方zip版)

    1.下载官方安装包(http://www.mysql.com/downloads/),此zip包是没有安装器的(*.msi),也没有辅助配置的自动程序. 2.解压zip包,将文件放入指定目录,如:D: ...

  9. 學習 DT device tree 以 ST 的開發板 STM32F429i-disc1 為例

    目標 因為對 device tree 不是很熟悉, 所以就將 device tree, 設為學習目標. 啟動 注意, 這篇隨筆的解說都放在最下面,會標 Explanation_XX,只要搜尋 Expl ...

  10. Sql 2008R2 windows身份好用 ,sa身份不好用

    Sql server2008r2 安装完毕以后 windows身份验证好用,sa身份不好用,解决方法步骤如下: 1.首先用windows身份登录 2.SQL实例右键属性 3.安全性这一项 4.选择wi ...