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

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

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

Python:裝飾器的原理和案例

如意 ? 來源:百家號(hào) ? 作者: 人工智能研究院 ? 2020-07-01 11:35 ? 次閱讀

Python中的裝飾器用于擴(kuò)展可調(diào)用對(duì)象的功能,而無需修改其結(jié)構(gòu)?;旧?,裝飾器函數(shù)包裝另一個(gè)函數(shù)以增強(qiáng)或修改其行為。我們可以通過一個(gè)具體的例子了解基礎(chǔ)知識(shí)!讓我們編寫一個(gè)包含裝飾器實(shí)現(xiàn)示例的Python3代碼:

裝飾定義

defdecorator_func_logger(target_func):defwrapper_func():print(“Before calling”, target_func.__name__) target_func() print(“After calling”, target_func.__name__)return wrapper_funcdef target(): print(‘Python is in the decorated target function’)dec_func = decorator_func_logger(target)dec_func()Output:air-MacBook-Air:$ python DecoratorsExample.py(‘Before calling’, ‘target’)Python isin the decorated target function(‘After calling’, ‘target’)

上面的裝飾器結(jié)構(gòu)有助于我們?cè)谡{(diào)用目標(biāo)函數(shù)之前和之后在控制臺(tái)上顯示一些注釋。

以下是定義裝飾器的簡(jiǎn)單步驟;

首先,我們應(yīng)該定義一個(gè)可調(diào)用對(duì)象,例如裝飾器函數(shù),其中還包含一個(gè)包裝器函數(shù)。

裝飾器函數(shù)應(yīng)將目標(biāo)函數(shù)作為參數(shù)

并且它應(yīng)該返回包裝函數(shù),該包裝函數(shù)擴(kuò)展了作為參數(shù)傳遞的目標(biāo)函數(shù)。

包裝函數(shù)應(yīng)包含目標(biāo)函數(shù)調(diào)用以及擴(kuò)展目標(biāo)函數(shù)行為的代碼。

defdecorator_func_logger(target_func):defwrapper_func(): print(“Before calling”, target_func.__name__) target_func() print(“After calling”, target_func.__name__)return wrapper_func@decorator_func_loggerdef target():print(‘Python is in the decorated target function’)target()Output:air-MacBook-Air:$ python DecoratorsExample.py(‘Before calling’, ‘target’)Python isin the decorated target function(‘After calling’, ‘target’)

借助Python提供的語法糖,我們可以簡(jiǎn)化裝飾器的定義,如上所示。

請(qǐng)注意,@ decorator_func_logger僅在我們要裝飾的目標(biāo)函數(shù)之前添加。然后,我們可以直接調(diào)用目標(biāo)函數(shù)。就像我們?cè)诘谝粋€(gè)實(shí)例中所做的那樣,無需顯式分配裝飾器。

定義多個(gè)裝飾器并使用參數(shù)裝飾函數(shù)

import timedef decorator_func_logger(target_func):defwrapper_func(*args, **kwargs):print(“Before calling”, target_func.__name__) target_func(*args, **kwargs)print(“After calling”, target_func.__name__)return wrapper_funcdef decorator_func_timeit(target_func):defwrapper_func(*args, **kwargs): ts = time.time() target_func(*args, **kwargs) te = time.time()print (target_func.__name__, (te - ts) * 1000)return wrapper_func@decorator_func_logger@decorator_func_timeitdef target(loop): count = 0 print(‘Python is in the decorated target function’)for number in range(loop): count += numbertarget(100)target(3000)Output:air-MacBook-Air:$ python DecoratorsExample.py(‘Before calling’, ‘wrapper_func’)Python isin the decorated target function(‘target’, 0.015974044799804688)(‘After calling’, ‘wrapper_func’)(‘Before calling’, ‘wrapper_func’)Python isin the decorated target function(‘target’, 0.47397613525390625)(‘After calling’, ‘wrapper_func’)

通過使用‘@’語法在目標(biāo)函數(shù)之前添加多個(gè)裝飾器,可以輕松地用多個(gè)裝飾器裝飾目標(biāo)函數(shù)。裝飾器的執(zhí)行順序?qū)⑴c在目標(biāo)函數(shù)之前列出的順序相同。

請(qǐng)注意,我們的目標(biāo)函數(shù)中有一個(gè)參數(shù)loop。只要包裝函數(shù)使用相同的參數(shù),就沒有問題。為了確保裝飾器可以靈活地接受任意數(shù)量的參數(shù),將(* args,** kwargs)參數(shù)用于包裝函數(shù)。

重要要點(diǎn)

裝飾器定義可重用的代碼塊,您可以將這些代碼塊應(yīng)用于可調(diào)用對(duì)象(函數(shù),方法,類,對(duì)象),以修改或擴(kuò)展其行為,而無需修改對(duì)象本身。

請(qǐng)考慮您的腳本中有許多函數(shù)執(zhí)行許多不同的任務(wù),并且需要向所有函數(shù)添加特定的行為。在這種情況下,將相同的代碼塊復(fù)制到函數(shù)中以具有所需的功能不是一個(gè)好的解決方案。您可以簡(jiǎn)單地裝飾函數(shù)。

聲明:本文內(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

    文章

    4279

    瀏覽量

    62325
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84375
  • 調(diào)用
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    3213
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    鴻蒙OS開發(fā)實(shí)例:【ArkTS類庫(kù)多線程@Concurrent裝飾校驗(yàn)并發(fā)函數(shù)】

    在使用TaskPool時(shí),執(zhí)行的并發(fā)函數(shù)需要使用該裝飾修飾,否則無法通過相關(guān)校驗(yàn)。從API version 9開始,該裝飾支持在ArkTS卡片中使用。
    的頭像 發(fā)表于 04-02 14:45 ?565次閱讀
    鴻蒙OS開發(fā)實(shí)例:【ArkTS類庫(kù)多線程@Concurrent<b class='flag-5'>裝飾</b><b class='flag-5'>器</b>校驗(yàn)并發(fā)函數(shù)】

    鴻蒙OS開發(fā)實(shí)例:【裝飾@Observed@ObjectLink】

    加深對(duì)@Observed@ObjectLink 裝飾器使用的理解,以小故事做注釋
    的頭像 發(fā)表于 03-28 17:05 ?923次閱讀
    鴻蒙OS開發(fā)實(shí)例:【<b class='flag-5'>裝飾</b><b class='flag-5'>器</b>@Observed@ObjectLink】

    鴻蒙原生應(yīng)用開發(fā)-ArkTS語言基礎(chǔ)類庫(kù)多線程@Concurrent裝飾校驗(yàn)并發(fā)函數(shù)

    在使用TaskPool時(shí),執(zhí)行的并發(fā)函數(shù)需要使用該裝飾修飾,否則無法通過相關(guān)校驗(yàn)。從API version 9開始,該裝飾支持在ArkTS卡片中使用。
    發(fā)表于 03-18 10:30

    OpenHarmony父子組件單項(xiàng)同步使用:@Prop裝飾

    @Prop裝飾的變量可以和父組件建立單向的同步關(guān)系。@Prop裝飾的變量是可變的,但是變化不會(huì)同步回其父組件。 說明: 從API version 9開始,該裝飾支持在ArkTS卡片中
    的頭像 發(fā)表于 02-03 10:57 ?374次閱讀
    OpenHarmony父子組件單項(xiàng)同步使用:@Prop<b class='flag-5'>裝飾</b><b class='flag-5'>器</b>

    OpenHarmony 定義擴(kuò)展組件樣式:@Extend 裝飾

    說明: 從 API version 9 開始,該裝飾支持在 ArkTS 卡片中使用。 裝飾器使用說明 語法 ? @Extend(UIComponentName) function
    的頭像 發(fā)表于 02-01 20:53 ?250次閱讀

    Python運(yùn)行環(huán)境有哪些

    Python是一種廣泛使用的高級(jí)編程語言,它有許多種運(yùn)行環(huán)境,可以適應(yīng)不同的開發(fā)需求。下面將詳細(xì)介紹Python的幾種常見的運(yùn)行環(huán)境。 CPython: CPython是Python的默認(rèn)解釋
    的頭像 發(fā)表于 11-29 16:14 ?1870次閱讀

    查看python安裝路徑的方法

    Python是一種高級(jí)編程語言,常用于開發(fā)Web應(yīng)用、數(shù)據(jù)分析、人工智能等領(lǐng)域。在使用Python進(jìn)行開發(fā)之前,我們需要先安裝Python解釋,并了解
    的頭像 發(fā)表于 11-29 14:54 ?1.1w次閱讀

    python自帶的idle怎么進(jìn)入

    Python自帶的IDLE是一個(gè)集成開發(fā)環(huán)境(Integrated Development Environment),它通過提供編輯和交互式解釋,使得Python的開發(fā)變得更加簡(jiǎn)單
    的頭像 發(fā)表于 11-29 14:51 ?2142次閱讀

    python shell怎么用

    Python Shell是一種交互式解釋,可以通過命令行直接運(yùn)行Python代碼。在Shell中,可以輸入一行代碼并立即得到結(jié)果,非常適合于測(cè)試、嘗試新代碼或進(jìn)行簡(jiǎn)單的任務(wù)。本文將詳細(xì)介紹
    的頭像 發(fā)表于 11-29 14:36 ?1064次閱讀

    python軟件怎么運(yùn)行代碼

    Python是一種高級(jí)編程語言,它被廣泛用于開發(fā)各種類型的應(yīng)用程序,從簡(jiǎn)單的腳本到復(fù)雜的網(wǎng)絡(luò)應(yīng)用和機(jī)器學(xué)習(xí)模型。要運(yùn)行Python代碼,您需要一個(gè)Python解釋,它可以將您的代碼翻
    的頭像 發(fā)表于 11-28 16:02 ?842次閱讀

    運(yùn)行Python程序的幾種常見方法

    方法: 使用Python解釋 Python解釋是運(yùn)行Python程序的基本工具。在命令行中輸入 py
    的頭像 發(fā)表于 11-28 15:32 ?2322次閱讀

    如何運(yùn)行Python程序

    運(yùn)行Python程序非常簡(jiǎn)單。Python是一種解釋型語言,這意味著可以直接通過解釋來執(zhí)行代碼。下面我將詳細(xì)介紹如何運(yùn)行Python程序。 一、安裝
    的頭像 發(fā)表于 11-24 09:31 ?1121次閱讀

    python怎么運(yùn)行程序

    Python是一種廣泛使用的編程語言,它的簡(jiǎn)易和可讀性使得它成為初學(xué)者和專業(yè)開發(fā)人員的首選。在運(yùn)行Python程序之前,您需要安裝Python解釋,然后按照以下步驟進(jìn)行操作。 步驟1
    的頭像 發(fā)表于 11-24 09:25 ?2464次閱讀

    Python自帶的命令窗口

    Python自帶的命令窗口,也稱為Python交互式解釋,是Python編程語言的一個(gè)重要工具,它允許用戶在命令行界面中輸入和執(zhí)行Python
    的頭像 發(fā)表于 11-22 14:02 ?859次閱讀