欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

1、@staticmethod

@staticmethod是python開發(fā)者經常用來在一個類中聲明該函數(shù)是一個靜態(tài)函數(shù)時使用到的裝飾器,比如創(chuàng)建一個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裝飾器一般是對于一些公共的函數(shù),或是工具函數(shù)之類的函數(shù)進行聲明,聲明之后就不會將當前python類中的初始化變量信息等傳入到該函數(shù)中,可以看到print_hello_world函數(shù)并沒有self作為參數(shù)變量。

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

hello_world = HelloWorld()
hello_world.print_hello_world()

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

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

2、自定義裝飾器

其實,自定義裝飾器的過程也比較簡單,就是我們平常用到的函數(shù)或者python類的寫法就能夠實現(xiàn)。

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

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

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

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

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

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

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

這樣,我們通過python類就已經實現(xiàn)了python裝飾器的效果,使用一個函數(shù)來試驗一下效果。

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

hello_world()

調用使用了@print_message裝飾器的函數(shù),它會返回我們預期的一個函數(shù)結果的打印。

# 裝飾器,hello world!

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

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

因為,我們都知道在python中函數(shù)中再可以嵌套函數(shù)的,在函數(shù)中嵌套一個函數(shù)時上層的函數(shù)相對于子函數(shù)來說就是它的一個父級對象。

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

hello_world3()

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

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

多個裝飾器調用

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

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

hello_world3()

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

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

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

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

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

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

還是來介紹一下,算是屬于擴展知識吧,既然已經看到了這里,不妨再多掌握個小技能吧,哈哈~

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

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

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

print(hello_world4())

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

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

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

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

相關文章

  • 實現(xiàn)?Python?腳本生成命令行

    實現(xiàn)?Python?腳本生成命令行

    這篇文章主要介紹了實現(xiàn)?Python?腳本生成命令行,文章通過定義一個?scrape?方法展開詳細內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • python 利用百度API進行淘寶評論關鍵詞提取

    python 利用百度API進行淘寶評論關鍵詞提取

    這篇文章主要介紹了python 利用百度API進行淘寶評論關鍵詞提取,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-03-03
  • pandas.DataFrame中提取特定類型dtype的列

    pandas.DataFrame中提取特定類型dtype的列

    本文主要介紹了pandas.DataFrame中提取特定類型dtype的列,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • 一起來了解python的if流程控制

    一起來了解python的if流程控制

    這篇文章主要為大家詳細介紹了python的if流程控制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python求出0~100以內的所有素數(shù)

    Python求出0~100以內的所有素數(shù)

    質數(shù)又稱素數(shù)。一個大于1的自然數(shù),除了1和它自身外,不能被其他自然數(shù)整除的數(shù)叫做質數(shù);否則稱為合數(shù)。下面小編給大家?guī)砹薖ython求出0~100以內的所有素數(shù)實例代碼,需要的朋友參考下
    2018-01-01
  • python使用form-data形式上傳文件請求的方法

    python使用form-data形式上傳文件請求的方法

    Python中的multipart/form-data是一種HTTP POST請求的數(shù)據格式,用于上傳文件或二進制數(shù)據,下面這篇文章主要給大家介紹了關于python使用form-data形式上傳文件請求的相關資料,需要的朋友可以參考下
    2023-04-04
  • python pyg2plot的原理知識點總結

    python pyg2plot的原理知識點總結

    在本篇文章里小編給大家整理的是一篇關于python pyg2plot的原理知識點總結內容,有興趣的朋友們可以參考下。
    2021-02-02
  • Python attrs提高面向對象編程效率詳細

    Python attrs提高面向對象編程效率詳細

    Python是面向對象的語言,一般情況下使用面向對象編程會使得開發(fā)效率更高,軟件質量更好,并且代碼更易于擴展,可讀性和可維護性也更高,但是Python的類寫起來是真的累,這是可以在創(chuàng)建類的時候自動添加上attrs模塊,下面文章我們就來介紹這個東西,需要的朋友可參考一下
    2021-09-09
  • Python按照某列內容對兩個DataFrame進行合并操作方法

    Python按照某列內容對兩個DataFrame進行合并操作方法

    這篇文章主要給大家介紹了關于Python按照某列內容對兩個DataFrame進行合并操作的相關資料,文中通過代碼示例介紹的非常詳細,對大家學習或者使用Python具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Python如何創(chuàng)建裝飾器時保留函數(shù)元信息

    Python如何創(chuàng)建裝飾器時保留函數(shù)元信息

    這篇文章主要介紹了Python如何創(chuàng)建裝飾器時保留函數(shù)元信息,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-08-08

最新評論