0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在Python中裝飾器的使用

麥辣雞腿堡 ? 來(lái)源:Python都知道 ? 作者:Python都知道 ? 2023-06-21 16:54 ? 次閱讀

定義

首先我們先來(lái)了解下裝飾器的定義。顧名思義,在Python中,裝飾器本質(zhì)上就是一個(gè)函數(shù),它可以接收一個(gè)函數(shù)作為參數(shù),然后返回一個(gè)新的函數(shù)。這個(gè)新的函數(shù)可以在執(zhí)行原有函數(shù)之前或之后,對(duì)函數(shù)進(jìn)行一些額外的操作。

接下來(lái)我們舉一個(gè)簡(jiǎn)單的裝飾器例子

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print('Before function do something')
        result = func(*args, **kwargs)
        print('After function do something')
        return result
    return wrapper

這個(gè)裝飾器接收一個(gè)函數(shù)作為參數(shù),返回一個(gè)新的函數(shù)wrapper。wrapper函數(shù)在執(zhí)行原有函數(shù)之前打印一行Before function do something的信息,然后執(zhí)行原有函數(shù),最后打印一行After function do something的信息,并返回函數(shù)的結(jié)果。

裝飾器的使用

使用裝飾器時(shí),只需要在函數(shù)定義之前,加上@decorator的語(yǔ)法糖即可。

@my_decorator
def my_function():
    print('Hello, world!')

這個(gè)過程相當(dāng)于用my_decorator裝飾了my_function函數(shù)。當(dāng)調(diào)用my_function函數(shù)時(shí),實(shí)際上是調(diào)用了my_decorator返回的新函數(shù)wrapper。

帶參數(shù)的裝飾器

裝飾器也可以帶參數(shù),這樣就可以在不同的情況下,對(duì)同一個(gè)函數(shù)進(jìn)行不同的裝飾操作。

例如,下面的裝飾器接收一個(gè)參數(shù)message,用來(lái)指定在調(diào)用函數(shù)之前打印的信息:

def my_decorator(message):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print('Before function do something, Message:', message)
            result = func(*args, **kwargs)
            print('After function do something')
            return result
        return inner_wrapper
    return wrapper

這個(gè)過程相當(dāng)于用帶參數(shù)的my_decorator裝飾了my_function函數(shù)。當(dāng)調(diào)用my_function函數(shù)時(shí),實(shí)際上是調(diào)用了my_decorator返回的新函數(shù)inner_wrapper。

使用帶參數(shù)的裝飾器時(shí),需要在函數(shù)定義之前,寫上@decorator(param)的語(yǔ)法糖,其中param是傳給裝飾器的參數(shù)。

例如:

@my_decorator('Hello, world!')
def my_function():
    print('This is my function.')

多個(gè)裝飾器的使用

在Python中,允許在一個(gè)函數(shù)上使用多個(gè)裝飾器,這時(shí)需要按照從上到下的順序依次執(zhí)行這些裝飾器。例如:

@my_decorator1
@my_decorator2
def my_function():
    print('This is my function.')

這個(gè)定義就等價(jià)于下面的代碼

def my_function():
    print('This is my function.')

my_function = my_decorator1(my_decorator2(my_function))

這個(gè)過程相當(dāng)于先用my_decorator2裝飾my_function,然后再用my_decorator1裝飾裝飾后的函數(shù)。

帶參數(shù)的函數(shù)裝飾器

除了裝飾器可以帶參數(shù),還可以用一個(gè)函數(shù)作為裝飾器的參數(shù),來(lái)實(shí)現(xiàn)更復(fù)雜的裝飾器。例如:

def my_decorator(message):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print('Before function do something, Message:', message)
            result = func(*args, **kwargs)
            print('After function do something')
            return result
        return inner_wrapper
    return wrapper

@my_decorator('Hello, world!')
def my_function():
    print('This is my function.')

上面這段代碼就等同于下面的代碼:

def my_function():
    print('This is my function.')

my_decorator = my_decorator('Hello, world!')
my_function = my_decorator(my_function)

這個(gè)過程相當(dāng)于用帶參數(shù)的my_decorator裝飾了my_function函數(shù)。

總結(jié)

裝飾器是Python中非常重要的概念之一,它可以用來(lái)擴(kuò)展函數(shù)的功能,實(shí)現(xiàn)非常靈活的代碼重用。在Python中,可以使用@符號(hào)來(lái)應(yīng)用裝飾器,也可以手動(dòng)調(diào)用裝飾器來(lái)裝飾函數(shù)。

Python中的裝飾器有很多種實(shí)現(xiàn)方式,包括函數(shù)、類、函數(shù)上的多個(gè)裝飾器等等,每種實(shí)現(xiàn)方式都有各自的特點(diǎn)和應(yīng)用場(chǎng)景。在實(shí)際開發(fā)中,可以根據(jù)需要選擇適合的實(shí)現(xiàn)方式。

需要注意的是裝飾器雖然可以擴(kuò)展函數(shù)的功能,但過多地使用裝飾器也會(huì)導(dǎo)致代碼變得難以理解和維護(hù)。因此,在使用裝飾器時(shí),應(yīng)當(dāng)盡量保持簡(jiǎn)潔和清晰,避免過多使用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61967
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84077
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    python學(xué)習(xí):三個(gè)測(cè)試庫(kù)的裝飾實(shí)現(xiàn)思路

    Python 中實(shí)現(xiàn)參數(shù)化測(cè)試的幾個(gè)庫(kù),并留下一個(gè)問題: 它們是如何做到把一個(gè)方法變成多個(gè)方法,并且將每個(gè)方法與相應(yīng)的參數(shù)綁定起來(lái)的呢? 我們?cè)偬釤捯幌?,原問題等于是:一個(gè)類中,如何使用
    的頭像 發(fā)表于 09-27 11:44 ?3032次閱讀
    <b class='flag-5'>python</b>學(xué)習(xí):三個(gè)測(cè)試庫(kù)的<b class='flag-5'>裝飾</b><b class='flag-5'>器</b>實(shí)現(xiàn)思路

    理解Python裝飾及其工作原理

    Python 是一種對(duì)新手很友好的語(yǔ)言。但是,它也有很多較難掌握的高級(jí)功能,比如裝飾(decorator)。很多初學(xué)者一直不理解裝飾及其
    發(fā)表于 10-08 11:39 ?2162次閱讀

    windows下安裝python linux下安裝python masOS下安裝python

    想要開始Python編程之旅,首先得自己使用的計(jì)算機(jī)上安裝Python解釋環(huán)境,下面將以安裝官方的Python解釋
    發(fā)表于 06-11 16:59

    如何利用Python去實(shí)現(xiàn)一個(gè)帶有計(jì)時(shí)功能的裝飾

    fib(n - 1) + fib(n - 2)等價(jià)于fib = clock(fib) fib會(huì)作為func參數(shù)傳給clock。然后,clock函數(shù)會(huì)返回clocked函數(shù),Python解釋背后
    發(fā)表于 03-23 11:07

    分享python 7個(gè)好用的裝飾

    ): return x + y4、deprecated這個(gè)相信大家使用別的包時(shí)都遇到過,當(dāng)要下線一個(gè)老版本的函數(shù)的時(shí)候就可以使用這個(gè)裝飾。安裝:pip install Deprecated
    發(fā)表于 06-15 16:54

    OpenHarmony裝飾指定自定義組件:@BuilderParam裝飾

    UI描述的一個(gè)元素,類似slot占位符。 說明: 從API version 9開始,該裝飾支持ArkTS卡片中使用。 裝飾器使用說明 初始化@BuilderParam
    發(fā)表于 09-27 16:02

    一文讀懂Python裝飾

    裝飾前,還要先要明白一件事,Python 中的函數(shù)和 Java、C++不太一樣,Python 中的函數(shù)可以像普通變量一樣當(dāng)做參數(shù)傳遞給另外一個(gè)函數(shù)。
    發(fā)表于 04-28 10:48 ?3396次閱讀
    一文讀懂<b class='flag-5'>Python</b><b class='flag-5'>裝飾</b><b class='flag-5'>器</b>

    讓你學(xué)寫Python裝飾的五大理由

    你必須學(xué)寫Python裝飾的五個(gè)理由
    的頭像 發(fā)表于 03-02 10:06 ?1818次閱讀

    Python的函數(shù)裝飾器使用方法

    Python中的裝飾是一種可以裝飾其它對(duì)象的工具,簡(jiǎn)單地說,他們是修改其他函數(shù)的功能的函數(shù)。該工具本質(zhì)上是一個(gè)可調(diào)用的對(duì)象(callable),所以
    的頭像 發(fā)表于 01-21 11:36 ?1513次閱讀
    <b class='flag-5'>Python</b>的函數(shù)<b class='flag-5'>裝飾</b>器使用方法

    Python裝飾的原理和案例

    Python中的裝飾器用于擴(kuò)展可調(diào)用對(duì)象的功能,而無(wú)需修改其結(jié)構(gòu)?;旧?,裝飾函數(shù)包裝另一個(gè)函數(shù)以增強(qiáng)或修改其行為。我們可以通過一個(gè)具體的例子了解基礎(chǔ)知識(shí)!讓我們編寫一個(gè)包含
    的頭像 發(fā)表于 07-01 11:35 ?2154次閱讀

    裝飾模式和代理模式的區(qū)別

    什么是裝飾模式 裝飾模式(Decorator Pattern): 不改變對(duì)象自身的基礎(chǔ)上,
    的頭像 發(fā)表于 10-08 14:25 ?2615次閱讀
    <b class='flag-5'>裝飾</b><b class='flag-5'>器</b>模式和代理模式的區(qū)別

    Python自制簡(jiǎn)單實(shí)用的日志裝飾

    寫代碼的時(shí)候,往往會(huì)漏掉日志這個(gè)關(guān)鍵因素,導(dǎo)致功能在使用的時(shí)候出錯(cuò)卻無(wú)法溯源。 其實(shí),只需要寫一個(gè)非常簡(jiǎn)單的日志裝飾,我們就能大大提升排查問題的效率。 1.簡(jiǎn)陋版裝飾
    的頭像 發(fā)表于 10-21 14:39 ?614次閱讀
    <b class='flag-5'>Python</b>自制簡(jiǎn)單實(shí)用的日志<b class='flag-5'>裝飾</b><b class='flag-5'>器</b>

    Python 自制簡(jiǎn)單實(shí)用的日志裝飾

    寫代碼的時(shí)候,往往會(huì)漏掉日志這個(gè)關(guān)鍵因素,導(dǎo)致功能在使用的時(shí)候出錯(cuò)卻無(wú)法溯源。 其實(shí),只需要寫一個(gè)非常簡(jiǎn)單的日志裝飾,我們就能大大提升排查問題的效率。 1.簡(jiǎn)陋版裝飾
    的頭像 發(fā)表于 10-31 15:05 ?429次閱讀
    <b class='flag-5'>Python</b> 自制簡(jiǎn)單實(shí)用的日志<b class='flag-5'>裝飾</b><b class='flag-5'>器</b>

    如何寫一個(gè)簡(jiǎn)單的裝飾

    今天介紹的是一個(gè)已經(jīng)存在十三年,但是依舊不紅的庫(kù) decorator,好像很少有人知道他的存在一樣。 這個(gè)庫(kù)可以幫你做什么呢 ? 其實(shí)很簡(jiǎn)單,就是可以幫你更方便地寫python裝飾代碼,更重
    的頭像 發(fā)表于 11-01 09:54 ?402次閱讀
    如何寫一個(gè)簡(jiǎn)單的<b class='flag-5'>裝飾</b><b class='flag-5'>器</b>

    【每天學(xué)點(diǎn)AI】一個(gè)例子帶你了解Python裝飾到底干嘛!

    今天我們來(lái)聊聊一種能給你的代碼變得“加料”的神器——Python裝飾。就像一杯咖啡,原本它是苦的,為了讓它符合我的口味,我給它添加了糖,添加之后就完美的符合了我的口味。那么,裝飾
    的頭像 發(fā)表于 09-20 16:54 ?194次閱讀
    【每天學(xué)點(diǎn)AI】一個(gè)例子帶你了解<b class='flag-5'>Python</b><b class='flag-5'>裝飾</b><b class='flag-5'>器</b>到底<b class='flag-5'>在</b>干嘛!