Python初学者笔记(五):白话讲“装饰器”,你看不懂算我笨!

初学者又遇到难题了吧?听都没听说过,装饰器……英文:decorator,啥意思?室内装饰师,油漆匠,适于室内装饰的……

听不懂,更不知道啥意思,怎么用了吧?这不可怕,可怕的是那些大神,把这个东西写的巨复杂,你要看懂这个概念,还先要去学10个其它的概念,回来再看还不一定能看懂。

日常生活中有这种情况,商场刚装修完,都是大玻璃门,怕有人撞上,就要在上面用油漆写“小心琉璃”……但是玻璃太多,都写上字太费劲,干脆就用油漆画个叉就达到目的了。用油漆简单装饰一下,完成省得有人撞上和指路的功能。

“装饰器”就是做个装修标记,并且有它的功能,比如“小心玻璃”和“指路”,看到这个标记你就知道它要表达什么意思了,按着它的指示来肯定没错。

在Python里装饰器的定义:在程序运行时,增加动态功能的方式,称之为“装饰器”,装饰器本质上也是一个Python函数。

那么问题来了,有可能初学者对这个定义里的函数不理解,不得不多讲一点。

函数,“数”好理解,“函”本意就是一种平级之间的信,比如两个单位传达或者反馈信息。

假设有这样一种情况,你要出去旅游购物,又怕被黑,在出发前,找到好朋友诸葛不亮出主意,他给了你一个密函,告诉你到地方再打开。等你到地方打开一看,上写5个大字“报价砍一半”。接下来买什么东西,都按这个原则来,这个就是最基本的函数了。

写成公式:购买价格=对方报价乘0.5,这个公式就是函数公式。用标准定义来说“设在某变化过程中有两个变量x、y,如果对于x在某一范围内的每一个确定的值,y都有唯一确定的值与它对应,那么就称y是x的函数,x叫做自变量。”来段简单的代码感受一下这个“讲价函数”。

为了方便初学者,本文所有函数名称都使用全拼。

def Jianjia(x):  

    y =0.5  

    x = x * y  

    return x  

print(Hanshu(100))  

print(Hanshu(50))  

输出结果,你猜是不是50和25?我猜你猜对了。

def是固定格式,Hanshu就是函数的名称,(x)就是参数。

接下来,就要旅游购物了,好在有个机器人替我购物,它只能听懂Python语言,我要告诉它购买什么和详细的购买程序。

我要买三样东西:猪、大象、长颈鹿,流程是询价,对应东西,再购买。

有三个购买函数(Goumai_1,Goumai_2,Goumai_3),写出来的流程是这样:

def Goumai_1():  

    print('询价')  

    print('猪')  

    print('购买成功')  


def Goumai_2():  

    print('询价')  

    print('大象')  

    print('购买成功')  


def Goumai_3():  

    print('询价')  

    print('长颈鹿')  

    print('购买成功')  


Goumai_1()  

Goumai_2()  

Goumai_3()  

执行结果是这样:

询价  

猪  

购买成功  

询价  

大象  

购买成功  

询价  

长颈鹿  

购买成功  

现在我发现,这样写太复杂了。因为“询价”和“购买成功”动作是一样的,而且我要想在“购买成功”上加一个感叹号,需要加三次才能成功,如果买1000个东西,就要加1000次感叹号了,想想就要累死了。

于是我优化了一下程序,把购买东西Goumai(Dongxi)定义成了一个函数,执行的结果和上一个程序还是一样的,而且“购买成功”还加了一个感叹号,只操作了一次,可以显示三次啊。

def Goumai(Dongxi):  

    print('询价')  

    Dongxi()  

    print('购买成功!')  


def Zhu():  

    print('猪')  


def Daxiang():  

    print('大象')  


def Changjinglu():  

    print('长颈鹿')  


Goumai(Zhu)  

Goumai(Daxiang)  

Goumai(Changjinglu)  

但是问题又来了,每次我还要告诉机器人“购买(猪)”,“购买(大象)”,“购买(长颈鹿)”,能不能干脆点“购买”两个字都不说?直接在“猪、大象、长颈鹿”上做个标记,机器人看到标记就执行购买动作呢?答案当然是可以了。

这时“购买”就变成了一个固定的动作,而不是三个步骤,为了让机器人理解,我在“购买”函数里直接定义了这个动作函数。

def Goumai(Dongxi):  

    def Dongzuo():  

        print('询价')  

        Dongxi()  

        print('购买成功!')  

return Dongzuo  

这个时候装饰器才正式出场,装饰器就是用@来表示,加上动作函数名称。

比如下文中的,漂亮吗?

@Goumai  

可以理解成用@符号把购买这个两个字像用口香糖粘在了物品名称上一样。

机器人看到@的标签,就会按@里的动作来执行。

代码如下:

def Goumai(Dongxi):  

    def Dongzuo():  

        print('询价')  

        Dongxi()  

        print('购买成功!')  

    return Dongzuo  

@Goumai  

def Zhu():  

    print('猪')  

@Goumai  

def Daxiang():  

    print('大象')  

@Goumai  

def Changjinglu():  

    print('长颈鹿')  


Zhu()  

Daxiang()  

Changjinglu()  

再结合一下刚才的讲价函数,先询价,再讲价,再购买,就可以写成这样:

def Goumai(Dongxi):  

        def Dongzuo():  

        print('询价')  

        Dongxi()  

        print('购买成功!')  

        return Dongxi  

    return Dongzuo  


def JangJia(x):  

    y =0.5  

    x = int(x) * y  

    return x  

@Goumai  

def Zhu():  

    Baojia = input('请输入对方报价:')  

    Huanjia = JangJia(Baojia)  

    print('猪:' + str(Huanjia))  

@Goumai  

def Daxiang():  

    Baojia = input('请输入对方报价:')  

    Huanjia = JangJia(Baojia)  

    print('大象:' + str(Huanjia))  

@Goumai  

def Changjinglu():  

    Baojia = input('请输入对方报价:')  

    Huanjia = JangJia(Baojia)  

    print('长颈鹿:' + str(Huanjia))  


Zhu()  

Daxiang()  

Changjinglu()  

执行后的结果:

询价  

请输入对方报价:100  

猪:50.0  

购买成功!  

询价  

请输入对方报价:50  

大象:25.0  

购买成功!  

询价  

请输入对方报价:25  

长颈鹿:12.5  

购买成功!  

最后一个例程的代码其实还可以写的更简单,因为可以用多个装饰器,希望有高人帮忙再指导一下。

总之,先从感性上理解“装饰器”,后续才能进阶学习啊!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容