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

資訊專(zhuān)欄INFORMATION COLUMN

python中的裝飾器

張金寶 / 998人閱讀

摘要:的裝飾器是用來(lái)裝飾函數(shù)的。簡(jiǎn)單裝飾器裝飾器的語(yǔ)法糖是使用符號(hào)表示,裝飾器本身也是一個(gè)函數(shù),只不過(guò)參數(shù)是函數(shù)而已。保留函數(shù)的元信息被修飾之后的函數(shù),它的元信息都消失,被替換的函數(shù)代替。中提供了來(lái)保存函數(shù)的元信息。

python的裝飾器是用來(lái)裝飾函數(shù)的。這是什么意思呢?假如我們有一個(gè)函數(shù),這個(gè)函數(shù)的功能不能滿(mǎn)足我們現(xiàn)有的需求,那么我們可以通過(guò)裝飾器在這個(gè)函數(shù)執(zhí)行前執(zhí)行后做一些我們需要的操作(如果函數(shù)本身功能不滿(mǎn)足,那就直接修改方法體了,不需要裝飾器幫忙)

1. 簡(jiǎn)單裝飾器

裝飾器的語(yǔ)法糖是使用@符號(hào)表示,裝飾器本身也是一個(gè)函數(shù),只不過(guò)參數(shù)是函數(shù)而已。

def decor_function(func):
    def wrapper_function():
        print("[%s] %s() called" % (ctime(), func.__name__))
        return func()
    return wrapper_function

@decor_function
def my_func():
    print("Hello world")

...
my_func()

decor_function也就是我們的裝飾器函數(shù),它對(duì)原有的函數(shù)進(jìn)行包裝,返回一個(gè)包裝過(guò)的函數(shù)wrapper_function。使用@修飾過(guò)的函數(shù)my_func,返回的函數(shù)實(shí)際上是裝飾器返回的函數(shù)wrapper_function.

[Mon Jul  9 17:07:40 2018] my_func() called
Hello world
2. 修飾含有參數(shù)的函數(shù)

函數(shù)定義可以使用任意的參數(shù),那么裝飾器函數(shù)如何處理呢?其實(shí)很簡(jiǎn)單,使用*args**kargs就可以方便的調(diào)用了,只需要在裝飾器函數(shù)的返回的函數(shù)中將參數(shù)傳遞給被修飾的函數(shù)就可以了。

def decor_function(func):
    def wrapper_function(*args, **kargs):
        print("[%s] %s() called" % (ctime(), func.__name__))
        return func(*args, **kargs)
    return wrapper_function
  
@decor_function
def my_func_with_param(name):
    print("Hello", name)

my_func_with_param("Joe")
[Mon Jul  9 17:12:58 2018] my_func_with_param() called
Hello Joe
3. 裝飾函數(shù)帶參數(shù)

裝飾器函數(shù)本身也是可以帶參數(shù)的,使用參數(shù),可以根據(jù)具體的場(chǎng)景添加不同的功能實(shí)現(xiàn)。

def decor_function_with_parm(level):
    if level == "info":
        logging.info("info message logged")
    elif level == "error":
        logging.error("error message logged")
    else:
        logging.debug("debug message logged")

    def wrapper_outter_func(func):
        def wrapper_inner_func(*args, **kargs):
            func(*args, **kargs)
        return wrapper_inner_func

    return wrapper_outter_func


@decor_function_with_parm(level="info")
def my_func2(name):
    print("Hello,", name)


my_func2("Joe")

帶參數(shù)的裝飾器函數(shù)寫(xiě)起來(lái)比較麻煩,因?yàn)樾枰幚淼膮?shù)比較多,一般最外層的函數(shù)處理裝飾器參數(shù),接下來(lái)的函數(shù)處理func,最后一層函數(shù)用來(lái)處理被修飾的函數(shù)的參數(shù)。

4. 多重修飾

一個(gè)函數(shù)可以被多個(gè)裝飾器修飾,like this

@decor_function_with_parm(level="info")
@decor_function
def my_func():
    print("Hello world")

執(zhí)行的順序是:

f = decor_function_with_parm(level="info", decor_function(my_func()))
5.使用類(lèi)來(lái)處理

類(lèi)的__call__()方法可以把類(lèi)當(dāng)成函數(shù)來(lái)處理,所以類(lèi)也可以用做裝飾器

class Decor:
    def __init__(self, func):
        print("__init__ method called")
        self.func = func

    def __call__(self, *args, **kargs):
        print("__call__ method called")
        self.func(*args, **kargs)


@Decor
def func(name):
    print("func called")
    print("Hello,",name)


func("joe")

使用類(lèi)做裝飾器時(shí),init函數(shù)中添加被修飾函數(shù)的引用,在call函數(shù)中處理參數(shù)。

__init__ method called
__call__ method called
func called
Hello, joe
6.保留函數(shù)的元信息

被修飾之后的函數(shù),它的元信息都消失,被替換的wrapper函數(shù)代替。python中提供了functools.wraps來(lái)保存函數(shù)的元信息。wraps本身也是個(gè)裝飾器

def decor_function(func):
    @wraps(func)
    def wrapper_function(*args, **kargs):
        print("[%s] %s() called" % (ctime(), func.__name__))
        print(func.__name__)
        return func(*args, **kargs)
    return wrapper_function
   
@decor_function
def my_func_with_param(name):
    print("Hello", name)

my_func_with_param("joe")
print(my_func_with_param.__name__)
[Mon Jul  9 18:16:11 2018] my_func_with_param() called
my_func_with_param
Hello joe
my_func_with_param

參考:理解 Python 裝飾器看這一篇就夠了

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

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

相關(guān)文章

  • Python裝飾

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

    aisuhua 評(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)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之函數(shù)篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門(mén)Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握裝飾器的本質(zhì)、功...

    caozhijian 評(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í)才有閉包問(wèn)題。如果想保留函數(shù)原本的屬性,可以使用標(biāo)準(zhǔn)庫(kù)中的裝飾器。 《流暢的Python》筆記本篇將從最簡(jiǎn)單的裝飾器開(kāi)始,逐漸深入到閉包的概念,然后實(shí)現(xiàn)參數(shù)化裝飾器,最后介紹標(biāo)準(zhǔn)庫(kù)中常用的裝飾器。 1. 初步認(rèn)識(shí)裝飾器 函數(shù)裝飾...

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

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

    blastz 評(píng)論0 收藏0
  • python裝飾的原理和使用

    摘要:我們以測(cè)量函數(shù)運(yùn)行時(shí)間為例來(lái)講一講裝飾器的運(yùn)行原理。三更加通用的裝飾器前面兩部分講了裝飾器的原理,這一部分就講講要寫(xiě)出一個(gè)通用的裝飾器需要注意的問(wèn)題。首先就是參數(shù)的問(wèn)題,裝飾器返回的函數(shù)不是原來(lái)的函數(shù),函數(shù)的簽名也就和原來(lái)的函數(shù)簽名不一樣。 一、最簡(jiǎn)單的裝飾器 裝飾器是python中很基礎(chǔ)也很實(shí)用的一個(gè)特性。通過(guò)裝飾器我們可以很方便地為一些函數(shù)添加相同的功能。我們以測(cè)量函數(shù)運(yùn)行時(shí)間為例...

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

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

0條評(píng)論

張金寶

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<