国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python裝飾器

aisuhua / 1460人閱讀

摘要:一引用書流暢的書二基本概念問題裝飾器是什么解答嚴(yán)格來說,裝飾器只是語法糖,裝飾器是可調(diào)用的對(duì)象,可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,特殊的地方是裝飾器的參數(shù)是一個(gè)函數(shù)問題裝飾器有什么特性解答裝飾器有個(gè)特性,一是可以把被裝飾的函數(shù)替換成其他函數(shù),

一, 引用

[書] 流暢的Python

[書] Effective Python


二, 基本概念

問題1:裝飾器是什么?

解答: 嚴(yán)格來說,裝飾器只是語法糖, 裝飾器是可調(diào)用的對(duì)象,可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,特殊的地方是裝飾器的參數(shù)是一個(gè)函數(shù)

問題2:裝飾器有什么特性?

解答: 裝飾器有2個(gè)特性,一是可以把被裝飾的函數(shù)替換成其他函數(shù), 二是可以在加載模塊時(shí)候立即執(zhí)行

def decorate(func):
    print("running decorate", func)
    def decorate_inner():
        print("running decorate_inner function")
        return func()
    return decorate_inner

@decorate
def func_1():
    print("running func_1")

if __name__ == "__main__":

    print(func_1)

#返回值
running decorate 
.decorate_inner at 0x7f29f641cb70>

問題3:如何使用被裝飾函數(shù)中的參數(shù)?

解答: 通過args 和 *kwargs 傳遞被修飾函數(shù)中的參數(shù)

def decorate(func):
    def decorate_inner(*args, **kwargs):
        print(type(args), type(kwargs))
        print("args", args, "kwargs", kwargs)
        return func(*args, **kwargs)
    return decorate_inner

@decorate
def func_1(*args, **kwargs):
    print(args, kwargs)

if __name__ == "__main__":

    func_1("1", "2", "3", para_1="1", para_2="2", para_3="3")

#返回值
 
args ("1", "2", "3") kwargs {"para_2": "2", "para_1": "1", "para_3": "3"}
("1", "2", "3") {"para_2": "2", "para_1": "1", "para_3": "3"}

三, 疊放裝飾器

問題1:疊放裝飾器執(zhí)行順序是什么?

解答: 如果一個(gè)函數(shù)被多個(gè)裝飾器修飾,其實(shí)應(yīng)該是該函數(shù)先被最里面的裝飾器修飾后(下面例子中函數(shù)main()先被inner裝飾,變成新的函數(shù)),變成另一個(gè)函數(shù)后,再次被裝飾器修飾

def outer(func):
    print("enter outer", func)
    def wrapper():
        print("running outer")
        func()
    return wrapper

def inner(func):
    print("enter inner", func)
    def wrapper():
        print("running inner")
        func()
    return wrapper

@outer
@inner
def main():
    print("running main")

if __name__ == "__main__":

    main()

#返回值

enter inner 
enter outer .wrapper at 0x7fa1c96e8bf8>
running outer
running inner
running main

四, 標(biāo)準(zhǔn)庫中的裝飾器

問題1: 標(biāo)準(zhǔn)庫中都有哪些裝飾器?

解答: 標(biāo)準(zhǔn)庫中有多種裝飾器, 例如:裝飾方法的函數(shù)有property, classmethod, staticmethod; functools模塊中的lru_cache,?singledispatch, ?wraps 等等

from functools import lru_cache
from functools import singledispatch
from functools import wraps

問題2:為什么要使用@wraps裝飾器?它的作用是什么?

解答: 使用裝飾器會(huì)產(chǎn)生我們可能不希望出現(xiàn)的副作用, 例如:改變被修飾函數(shù)名稱,對(duì)于調(diào)試器或者對(duì)象序列化器等需要使用內(nèi)省機(jī)制的那些工具,可能會(huì)無法正常運(yùn)行;其實(shí)調(diào)用裝飾器后,會(huì)將同一個(gè)作用域中原來函數(shù)同名的那個(gè)變量(例如下面的func_1),重新賦值為裝飾器返回的對(duì)象;使用@wraps后,會(huì)把與內(nèi)部函數(shù)(被修飾函數(shù),例如下面的func_1)相關(guān)的重要元數(shù)據(jù)全部復(fù)制到外圍函數(shù)(例如下面的decorate_inner)

from functools import wraps

def decorate(func):
    print("running decorate", func)
    @wraps(func)
    def decorate_inner():
        print("running decorate_inner function", decorate_inner)
        return func()
    return decorate_inner

@decorate
def func_1():
    print("running func_1", func_1)

if __name__ == "__main__":

    func_1()

#返回值
running decorate 
running decorate_inner function 
running func_1 

五, 裝飾器設(shè)計(jì)模式

問題1: 什么是裝飾器設(shè)計(jì)模式?

解答: 動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé),就擴(kuò)展功能而言,裝飾器模式比子類化更加靈活,在設(shè)計(jì)模式中,裝飾器和組件都是抽象類,為了給具體的組件添加行為,具體的裝飾器實(shí)例要包裝具體組件的實(shí)例,即,裝飾器和所裝飾的組件接口一致,對(duì)使用該組建的客戶透明,將客戶的請(qǐng)求轉(zhuǎn)發(fā)給該組件,并且可能在轉(zhuǎn)發(fā)前后執(zhí)行一些額外的操作,透明性使得可以遞歸嵌套多個(gè)裝飾器,從而可以添加任意多個(gè)功能

問題2: Python中的裝飾器函數(shù)和設(shè)計(jì)模式中的裝飾器模式有什么關(guān)系?

解答:  修飾器模式和Python修飾器之間并不是一對(duì)一的等價(jià)關(guān)系, Python裝飾器函數(shù)更為強(qiáng)大,不僅僅可以實(shí)現(xiàn)裝飾器模式。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/40774.html

相關(guān)文章

  • Python】一文弄懂python裝飾(附源碼例子)

    摘要:裝飾器的使用符合了面向?qū)ο缶幊痰拈_放封閉原則。三簡(jiǎn)單的裝飾器基于上面的函數(shù)執(zhí)行時(shí)間的需求,我們就手寫一個(gè)簡(jiǎn)單的裝飾器進(jìn)行實(shí)現(xiàn)。函數(shù)體就是要實(shí)現(xiàn)裝飾器的內(nèi)容。類裝飾器的實(shí)現(xiàn)是調(diào)用了類里面的函數(shù)。類裝飾器的寫法比我們裝飾器函數(shù)的寫法更加簡(jiǎn)單。 目錄 前言 一、什么是裝飾器 二、為什么要用裝飾器 ...

    liuchengxu 評(píng)論0 收藏0
  • Python裝飾vs裝飾模式

    摘要:希望引以為戒鄭傳裝飾模式如果你了解,你肯定聽過裝飾器模式。在面向?qū)ο笾校b飾模式指動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加一些功能來說,裝飾模式比生成子類更為靈活。 漫談 如果作為一個(gè)Python入門,不了解Python裝飾器也沒什么,但是如果作為一個(gè)中級(jí)Python開發(fā)人員,如果再不對(duì)python裝飾器熟稔于心的話,那么可能并沒有量變積累到質(zhì)變。 我以前也看過很多講python 裝...

    stackvoid 評(píng)論0 收藏0
  • Python: 會(huì)打扮的裝飾

    摘要:一般情況下,我們使用裝飾器提供的語法糖,來簡(jiǎn)化上面的寫法像上面的情況,可以動(dòng)態(tài)修改函數(shù)或類功能的函數(shù)就是裝飾器。本文標(biāo)題為會(huì)打扮的裝飾器本文鏈接為參考資料修飾器的函數(shù)式編程中的裝飾器介紹思誠之道裝飾器入門與提高賴明星 裝飾器 我們知道,在 Python 中,我們可以像使用變量一樣使用函數(shù): 函數(shù)可以被賦值給其他變量 函數(shù)可以被刪除 可以在函數(shù)里面再定義函數(shù) 函數(shù)可以作為參數(shù)傳遞給另外...

    blastz 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路26-函數(shù)裝飾和閉包

    摘要:初步認(rèn)識(shí)裝飾器函數(shù)裝飾器用于在源代碼中標(biāo)記函數(shù),以某種方式增強(qiáng)函數(shù)的行為。函數(shù)裝飾器在導(dǎo)入模塊時(shí)立即執(zhí)行,而被裝飾的函數(shù)只在明確調(diào)用時(shí)運(yùn)行。只有涉及嵌套函數(shù)時(shí)才有閉包問題。如果想保留函數(shù)原本的屬性,可以使用標(biāo)準(zhǔn)庫中的裝飾器。 《流暢的Python》筆記本篇將從最簡(jiǎn)單的裝飾器開始,逐漸深入到閉包的概念,然后實(shí)現(xiàn)參數(shù)化裝飾器,最后介紹標(biāo)準(zhǔn)庫中常用的裝飾器。 1. 初步認(rèn)識(shí)裝飾器 函數(shù)裝飾...

    sunny5541 評(píng)論0 收藏0
  • Python中的函數(shù)裝飾和閉包

    摘要:變量查找規(guī)則在中一個(gè)變量的查找順序是局部環(huán)境,閉包,全局,內(nèi)建閉包引用了自由變量的函數(shù)。閉包的作用閉包的最大特點(diǎn)是可以將父函數(shù)的變量與內(nèi)部函數(shù)綁定,并返回綁定變量后的函數(shù),此時(shí)即便生成閉包的環(huán)境父函數(shù)已經(jīng)釋放,閉包仍然存在。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之函數(shù)篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握裝飾器的本質(zhì)、功...

    caozhijian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<