查看原文
其他

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

xinxin 菜鸟学Python 2020-11-17

这是菜鸟学Python的第66篇原创文章

阅读本文大概需要5分钟


        菜鸟学Python的入门课程已经写了60多篇,讲了很多好玩有趣的知识点,但是整个入门篇还有一个最难的东西没有讲,这个知识点好多书里面对这块要么不讲,要么就是讲的太深奥,这个知识点卡在那里很难受。这块到底是什么的,猜对了就是传说中的装饰器,我记得我好几年前刚学Python的时候,看装饰器就觉得看九阴真经里面的怪文字,完全看不懂,确实装饰器是一个非常难以理解的概念,相信很多初学者一定也有这样的困惑,所以我它放在我的入门篇的收尾部分.

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




1.什么是装饰器

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

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

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

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


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


2.装饰器的前传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)函数作为参数返回

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


>>

<function lower at 0x00000000027DAD68>

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功力)希望大家一起解答的,也可以发给我,我会在公众号推荐【每日一题】,一旦题目被入选的,所有打赏的收入全部给供稿者



下面是我公号ZZS【100offer】,邀请阿里大牛做的知乎Live

有兴趣的小伙伴可以扫描参加


公号ZZS【100offer】


3月29日,100offer 邀请了被称作「架构师的摇篮」的阿里中间件参加知乎 Live.阿里中间件承载了世界上最有挑战的场景,应对了一次次双十一的流量洪峰,他们对人才的要求指引优秀架构师之路的方向。

扫描二维码,参与 Live 会让你了解怎么样的架构师才能胜任顶尖团队中的工作。




欢迎大家关注 菜鸟学Python",更多好玩有趣的Python原创教程,趣味算法,经验技巧,行业动态,尽在菜鸟学Python,一起来学python吧



最佳历史人气文章

Python语言如何入门

最全的零基础学Python的问题,你想知道的都在这里

Python入门原创文章,2016年度大盘点

用Python写个弹球的游戏

Python写个迷你聊天机器人|生成器的高级用法

用Python破解微软面试题|24点游戏

一道Google的算法题 |Python巧妙破解



 长按二维码,关注【菜鸟学python】



来源 | 菜鸟学Python

作者 | xinxin

本文章为菜鸟学Python独家原创稿件,未经授权不得转载







    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存