详解Python中最难理解的点-装饰器


Posted in Python onApril 03, 2017

本文将带领大家由浅入深的去窥探一下,这个装饰器到底是何方神圣,看完本篇,装饰器就再也不是难点了.

一、什么是装饰器

网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象

  • 每个人都有的内裤主要是用来遮羞,但是到了冬天它没法为我们防风御寒,肿木办?
  • 我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤
  • 在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后再也不冷了

装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效

二、装饰器的前传4步曲

为什么讲装饰器要放在入门篇的末尾讲呢,因为这货太难了,里面有许多前提要懂。Python的函数相信大家都懂了,但是大家知不知道函数也是一种对象,可以像参数一样传递,我们看下面的例子吧:

1)函数也是对象

def message(word='hello'):
 return word.upper()+'!'
print message()
>>
HELLO!
my_message=message
print my_message
>>
<function message at 0x000000000288E198>

print my_message()
>>
HELLO!

也就是说message可以赋值给另外一个变量

2)函数可以嵌套,定义在另外一个函数内部

def show():
 print 'Run in show()'
 def message(word='hello'):
 return word
 print message()
 
show()
>>
Run in show()
hello

message可以嵌套在show函数里面,调用show的时候也会跑下message函数

3)函数作为参数返回

一个函数还可以当做另外一个函数的返回值,不信看下面这个例子

详解Python中最难理解的点-装饰器

>>
<function lower at 0x00000000027DAD68>
hello...

4)函数作为参数传入

我们先创建一个getName函数,然后把这个函数当做参数传递给foo函数

详解Python中最难理解的点-装饰器

>>
I will call the getName function later
leo

三、装饰器的真面目

1).经过前面几步,大家应该理解了函数可以作为参数传入,也可以当参数返回,而且还可以嵌套
装饰器其实就是对函数进行再次包装,它能够在不改变函数的前提下,增加函数的功能,可以在函数执行之前或者执行之后执行一段代码

详解Python中最难理解的点-装饰器

a_stand_alone_function()
>>
I am a stand alone function,don't you dare modify me
a_stand_alone_function_decorated=my_new_decorator(a_stand_alone_function)
a_stand_alone_function_decorated()
>>
Before the function runs
I am a stand alone function,don't you dare modify me
After the function runs

2).使用装饰器

详解Python中最难理解的点-装饰器

看这样简单吧,装饰器有一个语法糖@,直接@my_new_decorator就把上面一坨代码轻松化解了,这就是Pythonic的代码,简洁高效

其实相当于:

another_stand_alone_function=my_new_decorator(another_stand_alone_function)

四、为什么要使用装饰器

装饰器提供了一些和代码维护性和审美相关的优点。并且作为结构化工具,装饰器自然地促进了代码的封装,这减少了冗余性并使得未来维护和扩展变得更容易。

如果大家学过Django和Flask就会知道,web框架里面大量的使用装饰器进行代码的封装.我们下面看一个简单的例子:

我们有一个主题函数word()是输出一个字符串,我们有一个函数是把字符串变粗体,另外一个是变斜体。有了装饰器之后,我们可以非常灵活的组合,扩展函数的功能:

详解Python中最难理解的点-装饰器

>>
<b><i>hello</i></b>

有一点要注意,就是装饰器的顺序变了,结果是不一样的.

@makeitalic
@makebold
def word():
 return "hello"
print word()
>>
<i><b>hello</b></i>

好了装饰器的入门,就讲到这里,若有什么不懂的,也可以留言跟我探讨交流。其实还有很多装饰器的高级用法,比如装饰器传参数,类的装饰器等等我们后面会讲解。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python计算书页码的统计数字问题实例
Sep 26 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
tensorflow实现softma识别MNIST
Mar 12 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
python 调用钉钉机器人的方法
Feb 20 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
Python入门Anaconda和Pycharm的安装和配置详解
Jul 16 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
python 制作磁力搜索工具
Mar 04 Python
JSON Web Tokens的实现原理
Apr 02 #Python
Python 40行代码实现人脸识别功能
Apr 02 #Python
Python可变参数用法实例分析
Apr 02 #Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 #Python
Python中selenium实现文件上传所有方法整理总结
Apr 01 #Python
详解Python多线程Selenium跨浏览器测试
Apr 01 #Python
Python 基础之字符串string详解及实例
Apr 01 #Python
You might like
深入PHP运行环境配置的详解
2013/06/04 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
2014/11/03 PHP
yii中widget的用法
2014/12/03 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
列表内容的选择
2006/06/30 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
Javascript中神奇的this
2016/01/20 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
python 远程统计文件代码分享
2015/05/14 Python
开始着手第一个Django项目
2015/07/15 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
Python之多进程与多线程的使用
2021/02/23 Python
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
公司委托书格式范文
2014/04/04 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python
JavaScript 对象创建的3种方法
2021/11/17 Javascript