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

Python裝飾器使用方法全面梳理

 更新時(shí)間:2023年01月28日 10:01:55   作者:專(zhuān)注算法的馬里奧學(xué)長(zhǎng)  
這篇文章主要介紹了Python @property裝飾器的用法,在Python中,可以通過(guò)@property裝飾器將一個(gè)方法轉(zhuǎn)換為屬性,從而實(shí)現(xiàn)用于計(jì)算的屬性,下面文章圍繞主題展開(kāi)更多相關(guān)詳情,感興趣的小伙伴可以參考一下

1 裝飾器背景知識(shí)

1.1 基本概念

裝飾器(Decorator)是 Python 中一種函數(shù)或類(lèi),用來(lái)修飾其他函數(shù)或類(lèi)。裝飾器可以改變被裝飾函數(shù)的行為,或者在調(diào)用被裝飾函數(shù)之前和之后增加額外的操作。裝飾器的語(yǔ)法是使用 @ 語(yǔ)法符,在函數(shù)定義之前增加裝飾器函數(shù)的名稱(chēng)。

@decorator_func
def my_func():
    pass

1.2 應(yīng)用場(chǎng)景

  • 代碼重用:裝飾器可以讓我們?cè)诓桓脑瘮?shù)代碼的情況下,為其添加額外的功能。
  • 日志記錄:裝飾器可以記錄函數(shù)的調(diào)用日志,幫助我們追蹤程序的運(yùn)行情況。
  • 權(quán)限控制:裝飾器可以用來(lái)實(shí)現(xiàn)函數(shù)級(jí)別的權(quán)限控制,只允許特定的用戶(hù)訪問(wèn)特定的函數(shù)。
  • 緩存:裝飾器可以用來(lái)緩存函數(shù)的返回值,避免重復(fù)計(jì)算。
  • 類(lèi)型檢查:裝飾器可以用來(lái)在函數(shù)調(diào)用前檢查參數(shù)的類(lèi)型是否符合要求。
  • 裝飾器可以讓你在函數(shù)或類(lèi)的定義中添加額外的邏輯,而不更改它們的實(shí)現(xiàn)。

2 簡(jiǎn)單的裝飾器代碼

def decorator_func(func):
    def wrapper():
        print("Before calling the function")
        func()
        print("After calling the function")
    return wrapper
@decorator_func
def my_func():
    print("Inside the function")
my_func()
# Output: Before calling the function
#         Inside the function
#         After calling the function

上面展示了最簡(jiǎn)單的裝飾器示例代碼。在代碼中,我們建立了一個(gè)名為decorator_func的裝飾器和一個(gè)名為my_func函數(shù)。

  • 裝飾器外部的return必須為裝飾器的內(nèi)部函數(shù),不含括號(hào)。通過(guò)代碼結(jié)構(gòu)可以看出,裝飾器本身也是一個(gè)閉包。
  • 在定義裝飾器decorator_func時(shí),括號(hào)中的’func’指代被裝飾器裝飾的函數(shù),在這段代碼中指代的就是my_func函數(shù)。
  • 在被裝飾器裝時(shí)候,函數(shù)的實(shí)際執(zhí)行執(zhí)行順序變成了內(nèi)部函數(shù)wrapper所指定的順序。即先執(zhí)行print(“Before calling the function”);再執(zhí)行func()指代的my_func函數(shù);最后執(zhí)行print(“After calling the function”)。
  • 本段代碼的最終輸出為:Before calling the function;Inside the function;After calling the function

3 使用裝飾器記錄函數(shù)執(zhí)行次數(shù)

def cal_times(func):
    l=[]
    def wrapper(*var):
        l.append('1')
        func(*var)
        print("函數(shù)執(zhí)行了%s次"%(len(l)))
    return wrapper
@cal_times
def my_func(i):
    print('%s的平方是%s'%(i,i**2))
my_func(5)
my_func(6)

my_func(i)函數(shù)中,我們?cè)黾恿诵螀⒌妮斎?,因此,在裝飾器中,也要為之做出更改。此處裝飾器中的wrapper函數(shù)我們使用*var傳參,這種設(shè)計(jì)方式的優(yōu)點(diǎn)是可以讓這個(gè)裝飾器適用于任何函數(shù)。

再加入了cal_times裝飾器后,函數(shù)每運(yùn)行一次,都會(huì)使列表l添加一個(gè)1,這樣可以計(jì)算函數(shù)的運(yùn)行次數(shù)。這段代碼的運(yùn)行結(jié)果如下:

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

裝飾器與函數(shù)一樣,也可以帶入?yún)?shù),我們?cè)诘诙?jié)的基礎(chǔ)上,對(duì)代碼做出如下修改:

def decorator_func(param1, param2):
    def decorator(func):
        def wrapper():
            print("Before calling the function with params:", param1,param2)
            func()
            print("After calling the function")
        return wrapper
    return decorator
@decorator_func("hello", "world")
def my_func():
    print("Inside the function")
my_func()

這段代碼使用了裝飾器來(lái)在my_func函數(shù)調(diào)用前后打印額外的信息,并且裝飾器函數(shù)decorator_func接受兩個(gè)參數(shù),在調(diào)用wrapper函數(shù)時(shí)使用這兩個(gè)參數(shù)。

最終,代碼將輸出:

Before calling the function with params: hello world; Inside the function;After calling the function。

如果同時(shí)還有字典類(lèi)型的參數(shù)傳入,可以使用(*var,**_var)進(jìn)行解決

5 裝飾器處理有返回值的函數(shù)

前面我們定義的函數(shù)都是執(zhí)行某種功能,不涉及到return的相關(guān)操作。當(dāng)涉及到處理有返回值的函數(shù)時(shí),對(duì)于內(nèi)部函數(shù)我們應(yīng)該使用一個(gè)變量將函數(shù)的運(yùn)行結(jié)果保存起來(lái),并放在內(nèi)層函數(shù)的return中。為了實(shí)現(xiàn)這一功能,我們將第三部分的代碼做出如下修改:

def cal_times(func):
    l=[]
    def wrapper(*var):
        l.append('1')
        result = func(*var)
        print("函數(shù)執(zhí)行了%s次"%(len(l)))
        return result
    return wrapper
@cal_times
def my_func(i):
    print('%s的平方是%s'%(i,i**2))
    return i**2
a = my_func(5)
b = my_func(6)
print(a,b)

對(duì)于這個(gè)裝飾器,我們?cè)趦?nèi)部函數(shù)wrapper使用result保存運(yùn)行結(jié)果,并將result return,這樣a與b就可以被正常的賦值,運(yùn)行結(jié)果如下圖。

而如果不執(zhí)行保存result并return,a和b將不會(huì)得到任何值:

到此這篇關(guān)于Python裝飾器使用方法全面梳理的文章就介紹到這了,更多相關(guān)Python裝飾器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python從入門(mén)到精通之Hash函數(shù)的使用詳解

    Python從入門(mén)到精通之Hash函數(shù)的使用詳解

    Python提供了強(qiáng)大而靈活的Hash函數(shù),用于在各種應(yīng)用中實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)校驗(yàn)、加密等功能,下面將從入門(mén)到精通介紹Python中Hash函數(shù)的使用,感興趣的可以了解一下
    2023-08-08
  • python 地圖經(jīng)緯度轉(zhuǎn)換、糾偏的實(shí)例代碼

    python 地圖經(jīng)緯度轉(zhuǎn)換、糾偏的實(shí)例代碼

    這篇文章主要介紹了python 地圖經(jīng)緯度轉(zhuǎn)換、糾偏的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • Pytorch實(shí)現(xiàn)LSTM和GRU示例

    Pytorch實(shí)現(xiàn)LSTM和GRU示例

    今天小編就為大家分享一篇Pytorch實(shí)現(xiàn)LSTM和GRU示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • PyQt5中QPushButton的用法詳細(xì)解析與應(yīng)用實(shí)戰(zhàn)

    PyQt5中QPushButton的用法詳細(xì)解析與應(yīng)用實(shí)戰(zhàn)

    PyQt5 是一個(gè)用于創(chuàng)建圖形用戶(hù)界面的 Python 綁定庫(kù),它基于 Qt5 應(yīng)用程序框架,在 PyQt5 中,QPushButton 是一個(gè)常用的控件,用于創(chuàng)建按鈕,允許用戶(hù)通過(guò)點(diǎn)擊來(lái)觸發(fā)某些操作,本文將詳細(xì)介紹 QPushButton 的用法,并通過(guò)實(shí)際案例來(lái)展示其強(qiáng)大的功能
    2024-07-07
  • 基于python讀取圖像的幾種方式匯總

    基于python讀取圖像的幾種方式匯總

    Python進(jìn)行圖片處理,第一步就是讀取圖片,下面這篇文章主要給大家介紹了關(guān)于基于python讀取圖像的幾種方式的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • python實(shí)現(xiàn)簡(jiǎn)單日期工具類(lèi)

    python實(shí)現(xiàn)簡(jiǎn)單日期工具類(lèi)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單日期工具類(lèi),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Python3操作MongoDB增冊(cè)改查等方法詳解

    Python3操作MongoDB增冊(cè)改查等方法詳解

    這篇文章主要介紹了Python操作MongoDB增冊(cè)改查等方法詳解,需要的朋友可以參考下
    2020-02-02
  • Python 使用list和tuple+條件判斷詳解

    Python 使用list和tuple+條件判斷詳解

    這篇文章主要介紹了Python 使用list和tuple+條件判斷詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Pycharm搭建Django項(xiàng)目詳細(xì)教程(看完這一篇就夠了)

    Pycharm搭建Django項(xiàng)目詳細(xì)教程(看完這一篇就夠了)

    這篇文章主要給大家介紹了關(guān)于Pycharm搭建Django項(xiàng)目的詳細(xì)教程,想要學(xué)習(xí)的小伙伴看完這一篇就夠了,pycharm是一種Python?IDE,帶有一整套可以幫助用戶(hù)在使用Python語(yǔ)言開(kāi)發(fā)時(shí)提高其效率的工具,需要的朋友可以參考下
    2023-11-11
  • Python 尋找局部最高點(diǎn)的實(shí)現(xiàn)

    Python 尋找局部最高點(diǎn)的實(shí)現(xiàn)

    今天小編就為大家分享一篇Python 尋找局部最高點(diǎn)的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12

最新評(píng)論