详解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中的sort方法使用详解
Jul 25 Python
在Python 3中实现类型检查器的简单方法
Jul 03 Python
Python实现调度算法代码详解
Dec 01 Python
Python yield与实现方法代码分析
Feb 06 Python
python如何为被装饰的函数保留元数据
Mar 21 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
Nov 01 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
详解Python 字符串相似性的几种度量方法
Aug 29 Python
python字典setdefault方法和get方法使用实例
Dec 25 Python
Python验证码截取识别代码实例
May 16 Python
python matplotlib库的基本使用
Sep 23 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引用符&amp;的用法详细解析
2013/08/22 PHP
php表单敏感字符过滤类
2014/12/08 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
Jquery 点击按钮显示和隐藏层的代码
2011/07/25 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
鼠标拖拽移动子窗体的JS实现
2014/02/25 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
Sea.JS知识总结
2016/05/05 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
Python实现的数据结构与算法之链表详解
2015/04/22 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
正规的求职信范文分享
2013/12/11 职场文书
上海世博会口号
2014/06/19 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
护理心得体会范文
2016/01/22 职场文书