python教程
www.piqizhu.com 關注我 python教程
131 人贊同了該回答
裝飾器就是把乙個猴子,塞入煉丹爐,然後就出來乙個還是會吃桃子,但有火眼金睛的猴子;還是原來的猴子,但多了特效技能。
下面我們以下4個方面介紹python的裝飾器:
什麼是裝飾器?
為什麼python要引入裝飾器?
裝飾器有利於解決哪些問題?
裝飾器背後的原理是什麼?
在回答以上4個問題的過程中,你會學會如何使用裝飾器
開始吧裝飾器可以讓乙個python函式擁有原本沒有的功能,也就是你可以通過裝飾器,讓乙個平淡無奇的函式變的強大,變的漂亮。
舉幾個現實中的例子
1、你乙個男的程式設計師,穿上**,戴上假髮,你就有了女人的外表(穿**、戴假髮的過程就是新的特效,你擁有了女人的外表,你原來的小jj還在,沒有消失)
2、你新買的毛坯房,裝修,買家具後變好看了(裝修、家具就是新的特效)
3、孫悟空被放進煉丹爐裝飾了一下,出來後,學會了火眼金睛,以前的本領都還在
因為引入裝飾器會便於開發,便於**復用,可以把爛泥扶上牆,
裝飾器可以讓你一秒變女人且可以保住小jj,當你某天後悔想重新變回男人,只要脫掉**和假髮即可(如果你變女人的時候,給小jj做了手術(直接修改函式體的內容),想再變回男人可就痛苦了哦)
例子1:
擴充套件功能
比如你寫了一段**,當你執行孫悟空()就列印出它目前的技能
# python3支援用中文做函式名,
# 這裡為了方便你理解,就用中文,實際情況為了相容性,你可別用中文哦
def孫悟空
(『吃桃子』
)孫悟空
()# 輸出:
# 吃桃子
現在你希望
孫悟空這個函式 列印出』有火眼金睛了』,該怎麼做呢?
是的,你可以直接在函式裡加一段print(『有火眼金睛了』)
但是這樣會破壞原來的**,如果你的**量很多很多的話,修改起來則是災難,
不過別擔心,你還可以用裝飾器來裝飾他,讓他在原本基礎上,擴充套件出新的功能
**如下
def
煉丹爐(
func
):# func就是『孫悟空』這個函式
def變身(*
args
,kwargs
):#args, **kwargs就是『孫悟空』的引數列表,這裡的『孫悟空』函式沒有傳引數,我們寫上也不影響,建議都寫上
print
(『有火眼金睛了』
)# 加特效,增加新功能,比如孫悟空的進了煉丹爐後,有了火眼金睛技能
return
func
(args
,kwargs
)#保留原來的功能,原來孫悟空的技能,如吃桃子
return
變身# 煉丹成功,更強大的,有了火眼金睛技能的孫悟空出世
@煉丹爐
def孫悟空
(『吃桃子』)
孫悟空()
# 輸出:
# 有火眼金睛了
# 吃桃子
例子2:擴充套件許可權認證
def
play
():print
()
play
()# 輸出
但是突然某天,你突然希望只允許1歲到10才可以看這個動畫片,不希望程式設計師大叔看這個動畫片怎麼辦?
是的,你可以修改這個**,加上年齡限制,但如果我們用裝飾器的話,就更簡單了,就可以不用破壞原來的**,而且方便擴充套件到其他函式上
userage
=40
defcanyou
(func
):def
decorator
(args,**
kwargs
):if
userage
>
1and
userage
<10:
return
func
(args,**
kwargs
(『你的年齡不符合要求,不能看』
)return
decorator
@canyou
defplay
():print()
play
()# 輸出
# 你的年齡不符合要求,不能看
# 你可以修改上面的 userage 為9 試試
你看,是不是很簡單,實際情況中,很多時候,你需要對一段**加上許可權認證,加上各種功能;但是又不想,或者不方便破壞原有**,則可以用裝飾器去擴充套件它
原理 **逆推後如下
def
煉丹爐(
func
):def變身(
args,**
kwargs
):print
(『有火眼金睛了』
)return
func
(args,**
kwargs
)return
變身
def孫悟空
(『吃桃子』)新
_孫悟空
=煉丹爐
(孫悟空
)#放入原料,原來的弱小的孫悟空,生成煉丹方案給 新_孫悟空 ,這裡也可以把煉丹方案給 原來的『孫悟空』,為了方便理解,給了新的孫悟空 新
_孫悟空
()# 執行煉丹程式,新的孫悟空出世
然後這段**,寫起來有點麻煩,python官方出了乙個快捷**,也就是語法糖,用了語法糖就變成了下面這樣
def
煉丹爐(
func
):def變身(
args,**
kwargs
):print
(『有火眼金睛了』
)return
func
(args,**
kwargs
)return
變身
@煉丹爐
# 把下面的 『孫悟空』 塞進煉丹爐,並把新的孫悟空複製給下面的函式
def孫悟空
(『吃桃子』)
孫悟空()
# 執行煉丹程式,新的孫悟空出世
可以一次性在乙個函式上用多個裝飾器嗎?
當然可以,下面我們給孫悟空,弄個金箍棒,讓他學會72變,學會飛
def
煉丹爐(
func
):def變身(
args,**
kwargs
):print
(『有火眼金睛了』
)return
func
(args,**
kwargs
)return
變身
def龍宮走一趟
(func
):def你好(
args,**
kwargs
(『有金箍棒了』
)return
func
(args,**
kwargs
)return你好
def拜師學藝
(func
):def師傅(
args,**
kwargs
(『學會飛、72變了』
)return
func
(args,**
kwargs
)return師傅
@拜師學藝
@龍宮走一趟
@煉丹爐
def孫悟空
(『吃桃子』)
孫悟空()
# 輸出
# 學會飛、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 函式的...