Python函數加工廠(裝飾器)

引言:

函數和裝飾器好比程序界的加工廠:

1、函數一般可用來加工一種或者多種數據類型的數據:字符串、數字、列表、字典等

舉一個簡單例子:已知半徑求面積

def s(r):
    s = 3.14 * r * r
    return s

調用s函數:輸入4,輸出半徑為4的圓的面積。a相當于面積的容器

a = s(4)
print(a)

2、裝飾器是用來裝飾函數的函數。其需要輸入的原材料為某個函數
以下是裝飾器的固定格式:

1 def timer(func):
2     def inner(*args,**kwargs):
3         '''執行函數之前要做的'''
4         re = func(*args,**kwargs)
5         '''執行函數之后要做的'''
6         return re
7     return inner

timer函數是一個進化函數的函數:裝飾器
timer是用來加工函數的,即產品應該也應該是函數(進化版)。

def timer(func):
    #
    #func的進化過程
    #
    return inner # 強化變身版func

上面的代碼就比較容易理解了,就是定義一個函數去強化函數,得到一個強化func
接下來,我們就深入研究func的強化過程:
1、你return了一個inner函數,他不是憑空產生的,就是石猴還不遠萬里去學藝,并取了了名字叫孫悟空呢。
所以一開始你要:

def inner(*args,**kwargs): # inner 今天成立了

我們知道inner是為了強化加工廠func的,所以inner需要的原材料必須是和func一樣的。啟動萬能可變參數(args,*kwargs)

    def inner(*args,**kwargs):
        '''執行函數之前要做的''' # 強化1
        re = func(*args,**kwargs)    # 這個是原函數的核心部件,你就不要隨便動他了。。。否則,你為啥不自己寫一個程序。。。
        '''執行函數之后要做的''' #強化2
        return re

我們再講一下為啥要要有 re 這個東西,還要return
因為這就是func原工廠生產的東西啊。。。沒有return 你就丟了啊
到了最后變身的 時候了。。。
hahaha之前是一個小小加工廠,注冊資金只有10w
后來王思聰老公投資了1億,hahaha立馬走上人生巔峰
inner 是哈哈哈被timer(王思聰)強化后的hahaha
這時候工商局找來了。。。指著inner說,你不就是原來的hahaha么,必須在我這更改相關信息,但是名字就不能改了
認證:hahaha = timer(hahaha) # 注冊資金1億
后來工商局發現經常性工廠升級,所以后來就直接在營業執照上蓋了個戳
@timer
講了這么多,就是為了加深大家的理解,其實記住下面的就好了

def wrapper(func):

    def inner(*args,**kwargs):#定義函數的時候——*參數的聚合

        ret = func(*args,**kwargs)  #調用函數的時候——*參數的打散

        #func是被裝飾的函數,ret是被裝飾函數的返回值

        return ret #把被裝飾的函數的返回值返回給調用者

    return inner

帶參數的裝飾器
假如你有成千上萬個函數使用了一個裝飾器,現在你想把這些裝飾器都取消掉,你要怎么做?

def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''執行函數之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''執行函數之后要做的''')
            return re
        return inner
    return timer

@outer(False)
def func():
    print(111)

func()

多個裝飾器裝飾同一個函數

def wrapper1(func):
    def inner():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner

def wrapper2(func):
    def inner():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner

@wrapper2
@wrapper1
def f():
    print('in f')

f()

附加:關于可變參數的應用

#動態參數
def ccc(*args):#1,2,3,4,5
    print(args)

ccc(1,2,3,4,5)#按位置傳參數

t = (1,2,3,4,5)
ccc(t)  ((1, 2, 3, 4, 5),)
ccc(*t)  (1, 2, 3, 4, 5)

def ddd(**kwargs):
    print(kwargs)

# ddd(k = 'a',j = 'b')#按關鍵字傳參數

def eee(*args,**kwargs):
    print(args,kwargs)

# eee(12,123) #先按位置傳參,再按關鍵字傳參

def ccc(*args):
    print('ccc:',args)  #(1,2,3,4,5)
    def inner(a,b,c,d,e):
        print('inner',a,b,c,d,e)
    inner(*args)  #*(1,2,3,4,5)  打散

def inner(a,b,c,d,e):
    print('inner',a,b,c,d,e)
# ccc(1,2,3,4,5)
# inner(1,2,3,4,5)
有關裝飾器的處理過程
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容