一篇关于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装饰器,结果第二天默写,全错了,一道题抄十遍,共计二十遍. 要是装饰器是一人,我非要约他在必图拳馆来一场...... 下面容我展示一下默写二十遍的成果 语 ...
随机推荐
- 高考志愿填报:java 软件 程序员 目前的就业现状
大约在17年前,也就是2000年,学计算机专业的学生可以有大部分都进入本专业,并且就业非常容易.哪怕只会office套件,想找个工作也很简单.那时候学计算机就是最热门的行业. 那时候,搞Java的还是 ...
- 修改apache的默认www目录
httpd.conf配置文件#DocumentRoot "/var/www/html" //修改前DocumentRoot "/www" #<Direct ...
- JAVA基础——编程练习(二)
JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...
- String,StringBuffer与StringBuilder
1. String,StringBuffer与StringBuilder的区别 String:存储在常量池中:是不可变的字符序列,任何对String值的改变都会引发新的String对象的生成,因此执行 ...
- Mac之OS系统下搭建JavaEE环境 <五> 之Mysql数据库的安装及配置
这里将推荐两款 集成的Mysql环境 十分轻便好用,MAMP 和 XAMPP MAMP XAMPP 1.MAMP下载 官网: https://www.mamp.info/en/ 下载安装即可使用 MA ...
- POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups / HDU 1699 Jamie's Contact Groups / SCU 1996 Jamie's Contact Groups (二分,二分图匹配)
POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups ...
- MongoDB数据库聚合
前面的话 聚合操作主要用于对数据的批量处理,将记录按条件分组以后,然后再进行一系列操作,例如,求最大值.最小值.平均值,求和等操作.聚合操作还能够对记录进行复杂的操作,主要用于数理统计和数据挖掘.在 ...
- Ambari架构原理
不多说,直接上干货! Ambari 架构原理图 通过三张图来说明: 第一张架构图告诉我们:Ambari是Hortonworks贡献给社区的.完全开源的.Hadoop生态的集群管理.监控.部署的工具: ...
- Spark Streaming笔记——技术点汇总
目录 目录 概况 原理 API DStream WordCount示例 Input DStream Transformation Operation Output Operation 缓存与持久化 C ...
- Jenkins 的svn插件下载的代码不是最新代码的问题
项目组使用Jenkins做自动化的每日编译和单元测试.经常发现,当提交完代码后,在Jenkins的每日编译代码还是旧代码,刚提交的代码并没有check out出来. 后来发现Jenkins服务器的时间 ...