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

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

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

1 裝飾器背景知識

1.1 基本概念

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

@decorator_func
def my_func():
    pass

1.2 應(yīng)用場景

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

2 簡單的裝飾器代碼

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

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

  • 裝飾器外部的return必須為裝飾器的內(nèi)部函數(shù),不含括號。通過代碼結(jié)構(gòu)可以看出,裝飾器本身也是一個閉包。
  • 在定義裝飾器decorator_func時,括號中的’func’指代被裝飾器裝飾的函數(shù),在這段代碼中指代的就是my_func函數(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ù)中,我們增加了形參的輸入,因此,在裝飾器中,也要為之做出更改。此處裝飾器中的wrapper函數(shù)我們使用*var傳參,這種設(shè)計方式的優(yōu)點是可以讓這個裝飾器適用于任何函數(shù)。

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

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

裝飾器與函數(shù)一樣,也可以帶入?yún)?shù),我們在第二節(jié)的基礎(chǔ)上,對代碼做出如下修改:

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()

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

最終,代碼將輸出:

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

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

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

前面我們定義的函數(shù)都是執(zhí)行某種功能,不涉及到return的相關(guān)操作。當涉及到處理有返回值的函數(shù)時,對于內(nèi)部函數(shù)我們應(yīng)該使用一個變量將函數(shù)的運行結(jié)果保存起來,并放在內(nèi)層函數(shù)的return中。為了實現(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)

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

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

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

相關(guān)文章

  • 論文查重python文本相似性計算simhash源碼

    論文查重python文本相似性計算simhash源碼

    這篇文章主要為大家介紹了python文本相似性計算simhash源碼來實現(xiàn)論文的查重,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • Python實現(xiàn)獲取某天是某個月中的第幾周

    Python實現(xiàn)獲取某天是某個月中的第幾周

    這篇文章主要介紹了Python實現(xiàn)獲取某天是某個月中的第幾周,本文代碼實現(xiàn)獲取指定的某天是某個月中的第幾周、周一作為一周的開始,需要的朋友可以參考下
    2015-02-02
  • Python+Opencv文本檢測的實現(xiàn)

    Python+Opencv文本檢測的實現(xiàn)

    本文主要介紹了如何使用OpenCV和EAST文本檢測器檢測圖像中的文本,以便大家可以在自己的應(yīng)用程序中應(yīng)用文本檢測。感興趣的同學可以關(guān)注一下
    2021-11-11
  • django 使用內(nèi)置messages的操作

    django 使用內(nèi)置messages的操作

    這篇文章主要介紹了django 使用內(nèi)置messages的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python3通過selenium爬蟲獲取到dj商品的實例代碼

    python3通過selenium爬蟲獲取到dj商品的實例代碼

    這篇文章主要介紹了python3通過selenium爬蟲獲取到dj商品的實例代碼,需要的朋友可以參考下
    2019-04-04
  • python實現(xiàn)rar解壓和壓縮的方法(附源碼)

    python實現(xiàn)rar解壓和壓縮的方法(附源碼)

    數(shù)據(jù)量現(xiàn)在越來越大,壓縮文件在日常生活中很常用,這篇文章主要給大家介紹了關(guān)于python實現(xiàn)rar解壓和壓縮的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • 總結(jié)Python編程中函數(shù)的使用要點

    總結(jié)Python編程中函數(shù)的使用要點

    這篇文章主要介紹了Python編程中函數(shù)的使用要點總結(jié),文中也講到了人民群眾喜聞樂見的lambda表達式的用法,需要的朋友可以參考下
    2016-03-03
  • python等間距取值方式

    python等間距取值方式

    這篇文章主要介紹了python等間距取值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Django多app路由分發(fā)(純后端)

    Django多app路由分發(fā)(純后端)

    本文主要介紹了Django多app路由分發(fā),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • python 求1-100之間的奇數(shù)或者偶數(shù)之和的實例

    python 求1-100之間的奇數(shù)或者偶數(shù)之和的實例

    今天小編就為大家分享一篇python 求1-100之間的奇數(shù)或者偶數(shù)之和的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評論

井研县| 乌拉特前旗| 汾阳市| 嘉禾县| 日土县| 内江市| 佛山市| 尼勒克县| 岳阳市| 安吉县| 华坪县| 西和县| 健康| 那坡县| 盐城市| 洪泽县| 威远县| 万年县| 霞浦县| 宜州市| 宜章县| 萍乡市| 商河县| 梁山县| 龙海市| 大关县| 鄯善县| 修文县| 尚志市| 梅河口市| 阿图什市| 上犹县| 静安区| 井冈山市| 察隅县| 昭苏县| 崇文区| 渭南市| 徐闻县| 武威市| 怀安县|