一篇关于Python装饰器的博文
这是一篇关于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装饰器的博文的更多相关文章
- Python基础篇【第6篇】: Python装饰器
装饰器 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类, ...
- Python之路【第七篇】:Python装饰器
阅读目录 一.装饰器 1.装饰器的概念 #装饰器定义:本质就是函数,功能是为其他函数添加附加功能 二.装饰器需要遵循的原则 #原则: 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 装饰 ...
- Python 装饰器入门(上)
翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...
- Python装饰器总结,带你几步跨越此坑!
欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...
- 使用python装饰器计算函数运行时间的实例
使用python装饰器计算函数运行时间的实例 装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是 ...
- python 装饰器 一篇就能讲清楚
装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...
- 理解 Python 装饰器看这一篇就够了
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它 ...
- 转发对python装饰器的理解
[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文 http://blog.csdn.net/sxw3718401/article/details/3951958 ...
- 遥想大肠包小肠----python装饰器乱弹
说起装饰器就tm蛋疼,在老男孩学习python装饰器,结果第二天默写,全错了,一道题抄十遍,共计二十遍. 要是装饰器是一人,我非要约他在必图拳馆来一场...... 下面容我展示一下默写二十遍的成果 语 ...
随机推荐
- Strom序列化机制
Storm 中的 tuple可以包含任何类型的对象.由于Storm 是一个分布式系统,所以在不同的任务之间传递消息时Storm必须知道怎样序列化.反序列化消息对象. Storm 使用 Kryo库对对象 ...
- img如果没有图片显示默认图片效果
img如果没有图片显示默认图片效果<img src="本来要显示的图片URL" onerror="this.src='图片挂了的话要显示的默认图片URL'" ...
- 让textarea和附近的文字居中对齐
textarea {display:inline-block;vertical-align:middle;}
- java桥连接sql server之登录验证及对数据库增删改查
一:步骤 1.sql server建立数据库和相关表 2.建立数据源 (1).打开控制面板找到管理,打开ODBC选项或直接搜索数据源 (2).打开数据源配置后点击添加,选择sql server点击 ...
- python实现希尔排序(已编程实现)
希尔排序: 观察一下”插入排序“:其实不难发现她有个缺点: 如果当数据是”5, 4, 3, 2, 1“的时候,此时我们将“无序块”中的记录插入到“有序块”时,估计俺们要崩盘, 每次插入都要移动位置,此 ...
- python迭代器生成器(三)
扩展的列表解析语法 今天接着昨天的继续写. 列表解析可以变得更加复杂---例如,它可以包含嵌套的循环,也可能被编写为一系列的for子句.(这里只是简单介绍一下,以后再说这个语法的问题) 例如:构建一个 ...
- NPOI 生成 excel基本设置
//设置页眉页脚 tempSheet.Header.Center = "2017-04-27"; tempSheet.Footer.Center = "√" + ...
- oracle批量数据导入工具 sqlldr
sqlldr工具参数: [oracle@server ~]$ sqlldr SQL*Loader: Release - Production on Wed Nov :: Copyright (c) , ...
- FileEditor
package JBJADV003; import java.io.*; class FileEditor { public static void main(String args[]) throw ...
- vijos1059题解
题目: XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大 ...