python裝飾器(形象生動)

2021-10-06 05:04:10 字數 4309 閱讀 1982

python教程

www.piqizhu.com 關注我 python教程

131 人贊同了該回答

裝飾器就是把乙個猴子,塞入煉丹爐,然後就出來乙個還是會吃桃子,但有火眼金睛的猴子;還是原來的猴子,但多了特效技能。

下面我們以下4個方面介紹python的裝飾器:

什麼是裝飾器?

為什麼python要引入裝飾器?

裝飾器有利於解決哪些問題?

裝飾器背後的原理是什麼?

在回答以上4個問題的過程中,你會學會如何使用裝飾器

開始吧裝飾器可以讓乙個python函式擁有原本沒有的功能,也就是你可以通過裝飾器,讓乙個平淡無奇的函式變的強大,變的漂亮。

舉幾個現實中的例子

1、你乙個男的程式設計師,穿上**,戴上假髮,你就有了女人的外表(穿**、戴假髮的過程就是新的特效,你擁有了女人的外表,你原來的小jj還在,沒有消失)

2、你新買的毛坯房,裝修,買家具後變好看了(裝修、家具就是新的特效)

3、孫悟空被放進煉丹爐裝飾了一下,出來後,學會了火眼金睛,以前的本領都還在

因為引入裝飾器會便於開發,便於**復用,可以把爛泥扶上牆,

裝飾器可以讓你一秒變女人且可以保住小jj,當你某天後悔想重新變回男人,只要脫掉**和假髮即可(如果你變女人的時候,給小jj做了手術(直接修改函式體的內容),想再變回男人可就痛苦了哦)

例子1:

擴充套件功能

比如你寫了一段**,當你執行孫悟空()就列印出它目前的技能

# python3支援用中文做函式名,

# 這裡為了方便你理解,就用中文,實際情況為了相容性,你可別用中文哦

def孫悟空

():print

(『吃桃子』

)孫悟空

()# 輸出:

# 吃桃子

現在你希望

孫悟空這個函式 列印出』有火眼金睛了』,該怎麼做呢?

是的,你可以直接在函式裡加一段print(『有火眼金睛了』)

但是這樣會破壞原來的**,如果你的**量很多很多的話,修改起來則是災難,

不過別擔心,你還可以用裝飾器來裝飾他,讓他在原本基礎上,擴充套件出新的功能

**如下

def

煉丹爐(

func

):# func就是『孫悟空』這個函式

def變身(*

args

,kwargs

):#args, **kwargs就是『孫悟空』的引數列表,這裡的『孫悟空』函式沒有傳引數,我們寫上也不影響,建議都寫上

print

(『有火眼金睛了』

)# 加特效,增加新功能,比如孫悟空的進了煉丹爐後,有了火眼金睛技能

return

func

(args

,kwargs

)#保留原來的功能,原來孫悟空的技能,如吃桃子

return

變身# 煉丹成功,更強大的,有了火眼金睛技能的孫悟空出世

@煉丹爐

def孫悟空

():print

(『吃桃子』)

孫悟空()

# 輸出:

# 有火眼金睛了

# 吃桃子

例子2:擴充套件許可權認證

def

play

():print

()

play

()# 輸出

但是突然某天,你突然希望只允許1歲到10才可以看這個動畫片,不希望程式設計師大叔看這個動畫片怎麼辦?

是的,你可以修改這個**,加上年齡限制,但如果我們用裝飾器的話,就更簡單了,就可以不用破壞原來的**,而且方便擴充套件到其他函式上

userage

=40

defcanyou

(func

):def

decorator

(args,**

kwargs

):if

userage

>

1and

userage

<10:

return

func

(args,**

kwargs

)print

(『你的年齡不符合要求,不能看』

)return

decorator

@canyou

defplay

():print()

play

()# 輸出

# 你的年齡不符合要求,不能看

# 你可以修改上面的 userage 為9 試試

你看,是不是很簡單,實際情況中,很多時候,你需要對一段**加上許可權認證,加上各種功能;但是又不想,或者不方便破壞原有**,則可以用裝飾器去擴充套件它

原理 **逆推後如下

def

煉丹爐(

func

):def變身(

args,**

kwargs

):print

(『有火眼金睛了』

)return

func

(args,**

kwargs

)return

變身

def孫悟空

():print

(『吃桃子』)新

_孫悟空

=煉丹爐

(孫悟空

)#放入原料,原來的弱小的孫悟空,生成煉丹方案給 新_孫悟空 ,這裡也可以把煉丹方案給 原來的『孫悟空』,為了方便理解,給了新的孫悟空 新

_孫悟空

()# 執行煉丹程式,新的孫悟空出世

然後這段**,寫起來有點麻煩,python官方出了乙個快捷**,也就是語法糖,用了語法糖就變成了下面這樣

def

煉丹爐(

func

):def變身(

args,**

kwargs

):print

(『有火眼金睛了』

)return

func

(args,**

kwargs

)return

變身

@煉丹爐

# 把下面的 『孫悟空』 塞進煉丹爐,並把新的孫悟空複製給下面的函式

def孫悟空

():print

(『吃桃子』)

孫悟空()

# 執行煉丹程式,新的孫悟空出世

可以一次性在乙個函式上用多個裝飾器嗎?

當然可以,下面我們給孫悟空,弄個金箍棒,讓他學會72變,學會飛

def

煉丹爐(

func

):def變身(

args,**

kwargs

):print

(『有火眼金睛了』

)return

func

(args,**

kwargs

)return

變身

def龍宮走一趟

(func

):def你好(

args,**

kwargs

):print

(『有金箍棒了』

)return

func

(args,**

kwargs

)return你好

def拜師學藝

(func

):def師傅(

args,**

kwargs

):print

(『學會飛、72變了』

)return

func

(args,**

kwargs

)return師傅

@拜師學藝

@龍宮走一趟

@煉丹爐

def孫悟空

():print

(『吃桃子』)

孫悟空()

# 輸出

# 學會飛、72變了

# 有金箍棒了

# 有火眼金睛了

# 吃桃子

上面**的等效於拜師學藝(龍宮走一趟(煉丹爐(孫悟空)))

**的執行順序是先從內到外

先執行 煉丹爐,然後是龍宮走一趟,最後是拜師學藝,

有小夥伴提問:先執行煉丹爐,為什麼沒有先輸出【有火眼金睛了】 ,而是先輸出了【拜師學藝】?

python 裝飾器執行順序迷思 - segmentfault

​segmentfault.com

Linux 五種IO模型 形象生動的例子

在學習五種io模型之前,我們先看這樣乙個例子 大家都釣過魚吧,釣魚最主要的步驟實際就兩個 1.等 2.拉桿。釣魚的時候你會發現有這樣幾種人 張三 此人比較沉悶安靜 就一直緊緊盯著魚鉤,一動不動,誰也不理,有魚就拉桿 李四 此人生性活潑好動 在等魚的時候,一會去找張三聊天,嘿,哥們,釣幾條魚了 張三不...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...