最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解如何創(chuàng)建自己的Python裝飾器

 更新時(shí)間:2022年09月04日 09:09:04   作者:Python 集中營(yíng)  
python裝飾器在平常的python編程中用到的還是很多的,本篇文章中我們將來(lái)介紹一下python中最常使用的@staticmethod裝飾器的使用,感興趣的可以了解一下

python裝飾器在平常的python編程中用到的還是很多的,在本篇文章中我們先來(lái)介紹一下python中最常使用的@staticmethod裝飾器的使用。

之后,我們會(huì)使用兩種不同的方式來(lái)創(chuàng)建自己的自定義python裝飾器以及如何在其他地方進(jìn)行調(diào)用。

1、@staticmethod

@staticmethod是python開發(fā)者經(jīng)常用來(lái)在一個(gè)類中聲明該函數(shù)是一個(gè)靜態(tài)函數(shù)時(shí)使用到的裝飾器,比如創(chuàng)建一個(gè)HelloWorld的python類,并且在其中使用該靜態(tài)裝飾器聲明其中的函數(shù)。

class HelloWorld():
    def __init__(self):
        super(HelloWorld, self).__init__()

    @staticmethod
    def print_hello_world():
        print('welcome to hello world!')

@staticmethod裝飾器一般是對(duì)于一些公共的函數(shù),或是工具函數(shù)之類的函數(shù)進(jìn)行聲明,聲明之后就不會(huì)將當(dāng)前python類中的初始化變量信息等傳入到該函數(shù)中,可以看到print_hello_world函數(shù)并沒(méi)有self作為參數(shù)變量。

接下來(lái)可以在初始化@staticmethod聲明的函數(shù)所在的類HelloWorld,并且調(diào)用print_hello_world函數(shù)。

hello_world = HelloWorld()
hello_world.print_hello_world()

會(huì)發(fā)現(xiàn)控制臺(tái)直接打印出了welcome to hello world!這行字符串。

實(shí)際上在python中的函數(shù)上面加入裝飾器只是為了在執(zhí)行當(dāng)前函數(shù)的邏輯之前去執(zhí)行一些我們需要執(zhí)行的業(yè)務(wù)功能,這樣的操作我們通過(guò)自定義自己的裝飾器也能夠?qū)崿F(xiàn)同樣的效果。

2、自定義裝飾器

其實(shí),自定義裝飾器的過(guò)程也比較簡(jiǎn)單,就是我們平常用到的函數(shù)或者python類的寫法就能夠?qū)崿F(xiàn)。

自己實(shí)現(xiàn)裝飾器主要有兩種方式,一種是通過(guò)class類的方式來(lái)實(shí)現(xiàn)的,另外一種則是通過(guò)python函數(shù)嵌套的方式來(lái)實(shí)現(xiàn)的,下面我們先來(lái)通過(guò)第一種的方式來(lái)實(shí)現(xiàn),也就是通過(guò)python類的方式來(lái)實(shí)現(xiàn)。

python類實(shí)現(xiàn)裝飾器

用python類來(lái)實(shí)現(xiàn)裝飾器時(shí),必須明白一個(gè)知識(shí)點(diǎn)。python類中實(shí)際上默認(rèn)有一個(gè)成員函數(shù)__call__,這個(gè)成員函數(shù)就是這個(gè)類被調(diào)用時(shí)的函數(shù)對(duì)象,若是需要自定義裝飾器實(shí)際上就是在python類的__call__函數(shù)中來(lái)實(shí)現(xiàn)裝飾器主要業(yè)務(wù)邏輯實(shí)現(xiàn)的。

class print_message(object):
    def __init__(self, function_):
        self.function_ = function_

    def __call__(self):
        # TODO:這里實(shí)際上是對(duì)傳入的函數(shù)返回值進(jìn)行的裝飾,可以理解成是一種回調(diào)。
        print('裝飾器,{}'.format(self.function_()))

注意:在下面這行代碼塊中一定要注意self.function_是一個(gè)函數(shù)對(duì)象,而self.function_()是一個(gè)函數(shù)返回值得效果。

print('裝飾器,{}'.format(self.function_()))

這樣,我們通過(guò)python類就已經(jīng)實(shí)現(xiàn)了python裝飾器的效果,使用一個(gè)函數(shù)來(lái)試驗(yàn)一下效果。

@print_message
def hello_world():
    return 'hello world!'

hello_world()

調(diào)用使用了@print_message裝飾器的函數(shù),它會(huì)返回我們預(yù)期的一個(gè)函數(shù)結(jié)果的打印。

# 裝飾器,hello world!

python函數(shù)嵌套實(shí)現(xiàn)裝飾器

上面的操作過(guò)程是通過(guò)重新定義了一個(gè)python類來(lái)實(shí)現(xiàn)裝飾器的效果的,這里再使用函數(shù)嵌套的方式來(lái)實(shí)現(xiàn)。

因?yàn)?,我們都知道在python中函數(shù)中再可以嵌套函數(shù)的,在函數(shù)中嵌套一個(gè)函數(shù)時(shí)上層的函數(shù)相對(duì)于子函數(shù)來(lái)說(shuō)就是它的一個(gè)父級(jí)對(duì)象。

@print_message2
@print_message
def hello_world3():
    return 'hello world!'

hello_world3()

# 裝飾器,hello world!
# 裝飾器2,None

使用函數(shù)嵌套的方式同樣實(shí)現(xiàn)了函數(shù)的裝飾器的效果,那么思考一下若是有兩個(gè)裝飾器可以在同一個(gè)函數(shù)中使用嗎?

多個(gè)裝飾器調(diào)用

話不多說(shuō),為了證明兩個(gè)裝飾器能不能放到一個(gè)函數(shù)上面使用,我們直接試一下效果如何。

@print_message2
@print_message
def hello_world3():
    return 'hello world!'

hello_world3()

# 裝飾器,hello world!
# 裝飾器2,None

從返回結(jié)果來(lái)看,首先是兩個(gè)裝飾器都是執(zhí)行了,從數(shù)據(jù)結(jié)果打印的順序來(lái)看自定義的裝飾器的執(zhí)行順序應(yīng)該是從距離函數(shù)最近的裝飾器開始執(zhí)行的,也就是從下往上的順序挨個(gè)執(zhí)行該函數(shù)上面的裝飾器的.

另外,裝飾器2的結(jié)果為None,這是為什么呢?

因?yàn)?第一個(gè)裝飾器執(zhí)行的時(shí)候,它的參數(shù)應(yīng)該是hello_world函數(shù)本身,但是當(dāng)?shù)诙€(gè)裝飾器執(zhí)行的時(shí)候第一個(gè)裝飾器并沒(méi)有返回結(jié)果知識(shí)做了打印,這個(gè)時(shí)候第二個(gè)裝飾器接收到的參數(shù)自然就是None了。

3、帶參數(shù)的裝飾器

說(shuō)實(shí)話帶參數(shù)的裝飾器在python中我見到的不多,不多在java中幾乎只要是裝飾器都是可以加參數(shù)執(zhí)行的。

還是來(lái)介紹一下,算是屬于擴(kuò)展知識(shí)吧,既然已經(jīng)看到了這里,不妨再多掌握個(gè)小技能吧,哈哈~

我們使用pytgon嵌套的函數(shù)功能來(lái)實(shí)現(xiàn)這個(gè)帶參數(shù)的裝飾器吧,個(gè)人覺得這種方便一些。

def header(message):
    def decorator(function_):
        def wrapper():
            return '帶參數(shù)的裝飾器,參數(shù):{0},{1}'.format(message, function_())
        return wrapper
    return decorator

@header('Python 集中營(yíng)')
def hello_world4():
    return 'hello world!'

print(hello_world4())

# 帶參數(shù)的裝飾器,參數(shù):Python 集中營(yíng),hello world!

OK,帶參數(shù)的裝飾器果然生效了,給@header加上參數(shù)@header(‘Python 集中營(yíng)’),上面裝飾器直接使用三層函數(shù)的嵌套來(lái)實(shí)現(xiàn)的。

第一層函數(shù)參數(shù)是我們需要自定義給裝飾器傳入的參數(shù),第二層則是傳入的已經(jīng)添加了裝飾器的函數(shù)本身,到了第三層才是真正的處理裝飾器自己的業(yè)務(wù)邏輯的。

到此這篇關(guān)于一文詳解如何創(chuàng)建自己的Python裝飾器的文章就介紹到這了,更多相關(guān)Python裝飾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 教你使用Python畫棵圣誕樹完整代碼

    教你使用Python畫棵圣誕樹完整代碼

    圣誕節(jié)快到了,今天小編通過(guò)代碼畫顆圣誕樹,主要通過(guò)t.pensize(10) 修改畫筆大小,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-12-12
  • Python實(shí)現(xiàn)矩陣轉(zhuǎn)置的方法分析

    Python實(shí)現(xiàn)矩陣轉(zhuǎn)置的方法分析

    這篇文章主要介紹了Python實(shí)現(xiàn)矩陣轉(zhuǎn)置的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python實(shí)現(xiàn)矩陣轉(zhuǎn)置的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Python中的pprint模塊

    Python中的pprint模塊

    本文介紹了 Python中的pprint模塊,pprint模塊包含一個(gè)“美觀打印機(jī)”,用于生成數(shù)據(jù)結(jié)構(gòu)的一個(gè)美觀的視圖。格式化工具會(huì)生成數(shù)據(jù)結(jié)構(gòu)的一些表示,不僅能夠由解釋器正確地解析,還便于人閱讀。輸出會(huì)盡可能放在一行上,分解為多行時(shí)會(huì)縮進(jìn),想了解具體內(nèi)容請(qǐng)參考下文
    2021-11-11
  • python pandas時(shí)序處理相關(guān)功能詳解

    python pandas時(shí)序處理相關(guān)功能詳解

    這篇文章主要介紹了python pandas時(shí)序處理相關(guān)功能詳解的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python 表達(dá)式和語(yǔ)句及for、while循環(huán)練習(xí)實(shí)例

    python 表達(dá)式和語(yǔ)句及for、while循環(huán)練習(xí)實(shí)例

    下面小編就為大家?guī)?lái)一篇python 表達(dá)式和語(yǔ)句及for、while循環(huán)練習(xí)實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 關(guān)于Python函數(shù)的定義和參數(shù)

    關(guān)于Python函數(shù)的定義和參數(shù)

    這篇文章主要介紹了關(guān)于Python函數(shù)的定義和參數(shù),Python中的函數(shù)我們可以理解成是一種具有功能的包裝塊,也就是封裝具有某一種功能的代碼塊,需要的朋友可以參考下
    2023-04-04
  • matplotlib相關(guān)系統(tǒng)目錄獲取方式小結(jié)

    matplotlib相關(guān)系統(tǒng)目錄獲取方式小結(jié)

    這篇文章主要介紹了matplotlib相關(guān)系統(tǒng)目錄獲取方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 基于SpringBoot構(gòu)造器注入循環(huán)依賴及解決方式

    基于SpringBoot構(gòu)造器注入循環(huán)依賴及解決方式

    這篇文章主要介紹了基于SpringBoot構(gòu)造器注入循環(huán)依賴及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • python實(shí)現(xiàn)批量圖片格式轉(zhuǎn)換

    python實(shí)現(xiàn)批量圖片格式轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量圖片格式轉(zhuǎn)換的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 詳解Python相關(guān)文件常見的后綴名

    詳解Python相關(guān)文件常見的后綴名

    常見的 Python 文件后綴有:py、pyc 、pyo、 pyi、pyw、 pyd、 pyx 等。本文給大家介紹Python相關(guān)文件常見的后綴名,感興趣的朋友跟隨小編一起看看吧
    2021-05-05

最新評(píng)論

永泰县| 兴安县| 淮南市| 禄丰县| 浮山县| 鄂托克旗| 平陆县| 根河市| 泰安市| 梁河县| 伊宁县| 普格县| 涟源市| 甘南县| 巴楚县| 永兴县| 固阳县| 谢通门县| 南丹县| 颍上县| 和平区| 囊谦县| 无为县| 延边| 东安县| 徐水县| 汕头市| 沧州市| 烟台市| 赫章县| 伊金霍洛旗| 龙泉市| 临高县| 陇川县| 崇文区| 繁昌县| 梅州市| 清涧县| 财经| 九寨沟县| 上杭县|