裝飾器

裝飾器

函數(shù)裝飾器旬迹,將其他函數(shù)功能增強(qiáng)求类,實(shí)現(xiàn)函數(shù)代碼重用,函數(shù)功能重用椿猎。性能測(cè)試,插日志犯眠,抽離出大量和函數(shù)無關(guān)的

裝飾器:

  • 裝飾器本身是一個(gè)函數(shù),用于裝飾其他函數(shù)
  • 功能:增強(qiáng)被裝飾函數(shù)的功能

裝飾器一般接受一個(gè)函數(shù)對(duì)象作為參數(shù)鸯旁,以對(duì)其進(jìn)行增強(qiáng)

def deco(func):
    def wrapper():
        print('please say something:')
        func()
        print('no zuo no die')
    return wrapper

@deco
def show():
    print('hello')

show()


閉包

函數(shù)對(duì)象(變量名為函數(shù)名)
    函數(shù)體

函數(shù)的參數(shù):位置參數(shù)铺罢,關(guān)鍵字參數(shù)残炮,argv位置參數(shù),*kwargv關(guān)鍵字參數(shù)泉瞻,參數(shù)分解賦值

函數(shù)可以嵌套蛋勺,在函數(shù)中定義并調(diào)用鸠删,在函數(shù)中定義函數(shù),并將其返回就叫做閉合函數(shù),也就是閉包
功用:內(nèi)層函數(shù)記憶外刃泡?層函數(shù)調(diào)用的變量

In [12]: def f(x):
   ....:     def f2(y):
   ....:         return x ** y
   ....:     return f2
   ....: 

In [13]: f(3)
Out[13]: <function __main__.f2>

In [14]: type(f(3))     # f(3) 是一個(gè)函數(shù)
Out[14]: function

In [15]: ff = f(3)

In [16]: ff(4)    
Out[16]: 81

In [17]: ff(5)
Out[17]: 243

In [18]: type(ff(4))       # ff(4)是一個(gè)整數(shù)
Out[18]: int


一切皆對(duì)象

In [27]: def hi():
   ....:     print('hello')
   ....:     

In [28]: hi()
hello

In [29]: greet = hi     # 函數(shù)名不過是函數(shù)體的個(gè)變量名,在不需要調(diào)用時(shí)烘贴,可直接作為變量拿來用

In [30]: greet()
hello

In [31]: del hi

In [32]: hi()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-32-9c04baa18e05> in <module>()
----> 1 hi()

NameError: name 'hi' is not defined

In [33]: greet()
hello

在函數(shù)中定義函數(shù)

從函數(shù)中返回函數(shù)

將函數(shù)作為參數(shù)傳遞給函數(shù)

藍(lán)本規(guī)范:

    from functools import wraps
    def decorator_name(f):
        @wraps(f)
        def decorated(*args, **kwargs):
            if not can_run:
                return "Function will not run"
            return f(*args, **kwargs)
        return decorated

    @decorator_name
    def func():
        return("Function is running")

    can_run = True
    print(func())
    # Output: Function is running

    can_run = False
    print(func())
    # Output: Function will not run

注意:@wraps接受一個(gè)函數(shù)來進(jìn)行裝飾桨踪,并加入了復(fù)制函數(shù)名稱、注釋文檔铺峭、參數(shù)列表等等的功能汽纠。這可以讓我們?cè)谘b飾器里面訪問在裝飾之前的函數(shù)的屬性。

使用場(chǎng)景

授權(quán)

裝飾器能有助于檢查某個(gè)人是否被授權(quán)去使用一個(gè)web應(yīng)用的端點(diǎn)(endpoint)莉炉。它們被大量使用于Flask和Django web框架中。這里是一個(gè)例子來使用基于裝飾器的授權(quán):

from functools import wraps

def requires_auth(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password):
            authenticate()
        return f(*args, **kwargs)
    return decorated

日志

日志是裝飾器運(yùn)用的另一個(gè)亮點(diǎn)絮宁。這是個(gè)例子:

from functools import wraps

def logit(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging

@logit
def addition_func(x):
   """Do some math."""
   return x + x


result = addition_func(4)
# Output: addition_func was called

帶參數(shù)的裝飾器

在函數(shù)中嵌入裝飾器
裝飾器類

參考:

馬哥python
python進(jìn)階


暫時(shí)只理解到簡(jiǎn)單的裝飾器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惕蹄,一起剝皮案震驚了整個(gè)濱河市治专,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌张峰,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撩荣,死亡現(xiàn)場(chǎng)離奇詭異餐曹,居然都是意外死亡敌厘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門饱狂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪彩,“玉大人,你說我怎么就攤上這事俊柔』詈希” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵尚骄,是天一觀的道長(zhǎng)侵续。 經(jīng)常有香客問我憨闰,道長(zhǎng)需五,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任泽示,我火速辦了婚禮械筛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘埋哟。我一直安慰自己郎汪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布抛计。 她就那樣靜靜地躺著吹截,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饭弓。 梳的紋絲不亂的頭發(fā)上媒抠,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天趴生,我揣著相機(jī)與錄音昏翰,去河邊找鬼。 笑死浸踩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的检碗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼另假,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼怕犁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奏甫,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤阵子,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后款筑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杈湾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年漆撞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了于宙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡至会,死狀恐怖谱俭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昆著,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布煤痕,位于F島的核電站,受9級(jí)特大地震影響塘匣,放射性物質(zhì)發(fā)生泄漏兆解。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一埠巨、第九天 我趴在偏房一處隱蔽的房頂上張望现拒。 院中可真熱鬧,春花似錦印蔬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瞧预,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垢油,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工躯喇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惊楼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像璃诀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本文為《爬著學(xué)Python》系列第四篇文章。從本篇開始校套,本專欄在順序更新的基礎(chǔ)上,會(huì)有不規(guī)則的更新笛匙。 在Pytho...
    SyPy閱讀 2,505評(píng)論 4 11
  • 呵呵!作為一名教python的老師秋柄,我發(fā)現(xiàn)學(xué)生們基本上一開始很難搞定python的裝飾器,也許因?yàn)檠b飾器確實(shí)很難懂...
    TypingQuietly閱讀 19,556評(píng)論 26 186
  • Python的裝飾器的英文名叫Decorator骇笔,要對(duì)一個(gè)已有的模塊做一些“修飾工作”笨触,所謂修飾工作就是想給現(xiàn)有的...
    Spareribs閱讀 676評(píng)論 1 11
  • 每個(gè)人都有的內(nèi)褲主要功能是用來遮羞雹舀,但是到了冬天它沒法為我們防風(fēng)御寒,咋辦葱跋?我們想到的一個(gè)辦法就是把內(nèi)褲改造一下,...
    chen_000閱讀 1,365評(píng)論 0 3
  • 香模庐,不只是一種味道,也是一種回憶掂碱。 小時(shí)候,世間的一切疼燥,仿佛都香味十足...
    271106閱讀 633評(píng)論 4 3