专栏首页北京马哥教育传说中Python最难理解的点,看这完篇就够了

传说中Python最难理解的点,看这完篇就够了

本文转载自简书,作者为菜鸟,感谢作者的辛苦付出。

这不是我第一次学Python入门课,去年、前年我都学过Python入门。所以文章的标题一点都没有标题党的意思。但是整个入门篇还有一个最难的东西没有讲,这个知识点好多书里面对这块要么不讲,要么就是讲的太深奥,这个知识点卡在那里很难受。

这块到底是什么的,猜对了就是传说中的装饰器,我记得我好几年前刚学Python的时候,看装饰器就觉得看九阴真经里面的怪文字,完全看不懂,确实装饰器是一个非常难以理解的概念。

1.什么是装饰器


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

每个人都有的内裤主要是用来遮羞,但是到了冬天它没法为我们防风御寒,肿木办?

我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤

在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后再也不冷了

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

2.装饰器的前传4步曲


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

1)函数也是对象

def message(word='hello'): return word.upper()+'!' print message() >> HELLO! my_message=message print my_message >> 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)函数作为参数返回

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

>> hello...

4)函数作为参数传入

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

>> I will call the getName function later leo

3.装饰器的真面目


1).经过前面几步,大家应该理解了函数可以作为参数传入,也可以当参数返回,而且还可以嵌套

装饰器其实就是对函数进行再次包装,它能够在不改变函数的前提下,增加函数的功能,可以在函数执行之前或者执行之后执行一段代码

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).使用装饰器

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

其实相当于:

another_stand_alone_function=my_new_decorator(another_stand_alone_function)

4.为什么要使用装饰器

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

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

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

输出<b><i>hello<i><b>

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

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

以上就是我对Python装饰器的一些个人总结,希望对你们有帮助。


本文分享自微信公众号 - 马哥Linux运维(magedu-Linux),作者:菜鸟

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-07-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 最全 Python3 函数知识点大全

    小小科
  • 大数据分析:地铁售卖机案例剖析

    作者:天天记 来源:今日头条 大家好,咱们接着前几天聊的大数据进行深一度的学习和了解,今天我们用一个现实的案例给大家呈现以下大数据的应用以及对我们的帮助。 在...

    小小科
  • 高性能服务器架构里的隐藏秘密

    来源:http://blog.csdn.net/marising/article/details/5186643

    小小科
  • thymeleaf 传递数据到js变量

    Dream城堡
  • 推荐一个jekyll博客模板

    本人用的模板是基于Codeboy的博客模板改造模板,(由于本人可能会有很多样式修改,所以不再将修改pullrequst到原项目,在此对codeboy模板表示感谢...

    付威
  • Kali Linux Web渗透测试手册(第二版) - 5.3 - 利用XSS获取Cookie

    在前几章中,我们知道了攻击者可以使用cookie来冒充当前用户的身份,在上一章节我们也简单地引入了XSS的基本概念。如果目标站点存在XSS漏洞并且Cookie并...

    用户1631416
  • Kali Linux Web渗透测试手册(第二版) - 5.3 - 利用XSS获取Cookie

    thr0cyte,Gr33k,花花,MrTools,R1ght0us,7089bAt,

    7089bAt@PowerLi
  • Pikachu漏洞靶场系列之XSS

    跨站脚本攻击(Cross-Site Scripting)简称为“CSS”,为避免与前端叠成样式表的缩写”CSS”冲突,故又称XSS。一般XSS可以分为如下几种常...

    FB客服
  • Bwapp漏洞平台答案全解-A3(第二篇)

    前言 接上篇XSS,没啥好讲的,直接看答案吧 A3 - Cross-Site Scripting (XSS) -3.11-XSS - Reflected(ph...

    用户1467662
  • silverlightLogo动画

    文件: silverlightLogoLoop.wmv SilverlightLogo.xml Silverlight.js demo.html Si...

    用户1172164

扫码关注云+社区

领取腾讯云代金券