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

Python中的閉包與裝飾器的用法詳解

 更新時間:2023年07月29日 10:09:54   作者:夏末ya  
這篇文章主要介紹了Python中的閉包與裝飾器的用法詳解,裝飾器本質(zhì)上是一個Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數(shù)對象,需要的朋友可以參考下

閉包

Python函數(shù)是支持嵌套的。如果在一個內(nèi)部函數(shù)中對外部函數(shù)作用域(非全局作用域)的變量進行引用,那么內(nèi)部函數(shù)就會被稱為閉包。

閉包需要滿足如下3個條件:

1.存在于兩個嵌套關(guān)系的函數(shù)中,并且閉包是內(nèi)部函數(shù);

2.內(nèi)部函數(shù)引用了外部函數(shù)的變量(自由變量);

3.外部函數(shù)會把內(nèi)部函數(shù)的函數(shù)名稱返回。

示例:

在這里插入圖片描述

裝飾器

1、裝飾器本質(zhì)上是一個Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數(shù)對象。它經(jīng)常用于有切面需求的場景,比如:插入日志、性能測試、事務(wù)處理、緩存、權(quán)限校驗等場景。裝飾器是解決這類問題的絕佳設(shè)計,有了裝飾器,我們就可以抽離出大量與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。

2、裝飾器是一個函數(shù),它需要接收一個參數(shù),該參數(shù)表示被修飾的函數(shù)。

例如,有如下一個裝飾器函數(shù):

def w1(func):
   print(‘正在裝飾')
    def inner():
        print(‘正在驗證權(quán)限')
        return inner()
  • 裝飾器是個嵌套函數(shù)
  • 內(nèi)部函數(shù)是一個閉包。
  • 外部函數(shù)接收的是被修飾的函數(shù)(func)

3、通過在函數(shù)定義的前面添加@符號和裝飾器名,實現(xiàn)裝飾器對函數(shù)的包裝。

給f1函數(shù)加上裝飾器,示例如下:

@w1
def f1():
    print('f1')

此時,程序會自動編譯生成調(diào)用裝飾器函數(shù)的代碼,等價于: f1 = w1(f1)

多個裝飾器

多個裝飾器應(yīng)用在一個函數(shù)上,調(diào)用順序是從下至上。

@w1
@w2
def f1():
        print(‘---f1---')

執(zhí)行順序:先執(zhí)行@w2,后執(zhí)行@w1

帶參數(shù)的裝飾器

假設(shè)我們前文的裝飾器需要完成的功能不僅僅是能在進入某個函數(shù)后打出log信息,而且還需指定log的級別,那么裝飾器就會是這樣的。

  def logging(level):
        def wrapper(func):
            def inner_wrapper(*args, **kwargs):
                print "[{level}]: enter function {func}()".format(
                    level=level,
                    func=func.__name__)
                return func(*args, **kwargs)
            return inner_wrapper
        return wrapper
    @logging(level='INFO') def say(something):
        print "say {}!".format(something)
    # 如果沒有使用@語法,等同于
    # say = logging(level='INFO')(say)
    @logging(level='DEBUG') def do(something):
        print "do {}...".format(something)
    if __name__ == '__main__':
        say('hello')
        do("my work")
  • 當(dāng)帶參數(shù)的裝飾器被打在某個函數(shù)上時,比如@logging(level=‘DEBUG’),它其實是一個函數(shù),會馬上被執(zhí)行,只要這個它返回的結(jié)果是一個裝飾器時,那就沒問題。

基于類實現(xiàn)的裝飾器

裝飾器函數(shù)其實是這樣一個接口約束,它必須接受一個callable對象作為參數(shù),然后返回一個callable對象。

在Python中一般callable對象都是函數(shù),但也有例外。只要某個對象重載了__call__()方法,那么這個對象就是callable的。

class Test():
    def __call__(self):
        print 'call me!'
t = Test()
t()  # call me

__call__這樣前后都帶下劃線的方法在Python中被稱為內(nèi)置方法,有時候也被稱為魔法方法。

重載這些魔法方法一般會改變對象的內(nèi)部行為。上面這個例子就讓一個類對象擁有了被調(diào)用的行為。

回到裝飾器上的概念上來,裝飾器要求接受一個callable對象,并返回一個callable對象(不太嚴(yán)謹(jǐn),詳見后文)。

那么用類來實現(xiàn)也是也可以的。我們可以讓類的構(gòu)造函數(shù)__init__()接受一個函數(shù),然后重載__call__()并返回一個函數(shù),也可以達到裝飾器函數(shù)的效果。

class logging(object):
    def __init__(self, func):
        self.func = func
    def __call__(self, *args, **kwargs):
        print "[DEBUG]: enter function {func}()".format(
            func=self.func.__name__)
        return self.func(*args, **kwargs)
@logging
def say(something):
    print "say {}!".format(something)

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

如果需要通過類形式實現(xiàn)帶參數(shù)的裝飾器,那么會比前面的例子稍微復(fù)雜一點。那么在構(gòu)造函數(shù)里接受的就不是一個函數(shù),而是傳入的參數(shù)。通過類把這些參數(shù)保存起來。然后在重載__call__方法是就需要接受一個函數(shù)并返回一個函數(shù)。

class logging(object):
    def __init__(self, level='INFO'):
        self.level = level
    def __call__(self, func): # 接受函數(shù)
        def wrapper(*args, **kwargs):
            print "[{level}]: enter function {func}()".format(
                level=self.level,
                func=func.__name__)
            func(*args, **kwargs)
        return wrapper  #返回函數(shù)
@logging(level='INFO')
def say(something):
    print "say {}!".format(something)

內(nèi)置的裝飾器

內(nèi)置的裝飾器和普通的裝飾器原理是一樣的,只不過返回的不是函數(shù),而是類對象。 在了解這個裝飾器前,你需要知道在不使用裝飾器怎么寫一個屬性。

def getx(self):
    return self._x
def setx(self, value):
    self._x = value
def delx(self):
   del self._x
# create a property
x = property(getx, setx, delx, "I am doc for x property")

以上就是一個Python屬性的標(biāo)準(zhǔn)寫法,其實和Java挺像的,但是太羅嗦。有了@語法糖,能達到一樣的效果但看起來更簡單。

@property
def x(self): ...
# 等同于
def x(self): ...
x = property(x)

帶有返回值的裝飾器

  def func(functionName):
        def func_in():  	  
        	return functionName()    
        return func_in 
     @func def test():
        return ‘itheima'

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

相關(guān)文章

  • Python讀取csv文件分隔符設(shè)置方法

    Python讀取csv文件分隔符設(shè)置方法

    今天小編就為大家分享一篇Python讀取csv文件分隔符設(shè)置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python實現(xiàn)五子棋算法

    python實現(xiàn)五子棋算法

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)五子棋算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • python進程管理工具supervisor的安裝與使用教程

    python進程管理工具supervisor的安裝與使用教程

    supervisor是用python寫的一個進程管理工具,用來啟動,重啟,關(guān)閉進程。下面這篇文章主要給大家介紹了關(guān)于python實現(xiàn)的進程管理工具supervisor的安裝與使用的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • 用python建立兩個Y軸的XY曲線圖方法

    用python建立兩個Y軸的XY曲線圖方法

    今天小編就為大家分享一篇用python建立兩個Y軸的XY曲線圖方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python實現(xiàn)繪制自定義形狀的詞云示例

    Python實現(xiàn)繪制自定義形狀的詞云示例

    這篇文章主要介紹了Python實現(xiàn)繪制自定義形狀的詞云示例,通過將一段文本中出現(xiàn)頻率高的單詞按其出現(xiàn)頻率大小以及顏色深淺排列成一個詞云圖形,從而更好地展示文本中的信息,需要的朋友可以參考下
    2022-10-10
  • python使用回溯算法實現(xiàn)列表全排列

    python使用回溯算法實現(xiàn)列表全排列

    這篇文章主要介紹了python使用回溯算法實現(xiàn)列表全排列,研究的問題是輸入列表L(不含重復(fù)元素),輸出L的全排列,全排列問題,可以用回溯法解決,需要的朋友可以參考下
    2023-11-11
  • Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼

    Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼

    這篇文章主要介紹了Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼,需要的朋友可以參考下
    2016-08-08
  • 使用Python實現(xiàn)合并多個Excel文件

    使用Python實現(xiàn)合并多個Excel文件

    合并Excel可以將多個文件中的數(shù)據(jù)合并到一個文件中,這樣可以幫助我們更好地匯總和管理數(shù)據(jù),本文主要介紹了如何使用第三方Python庫 Spire.XLS for Python 實現(xiàn)以上兩種合并Excel文件的需求,有需要的可以了解下
    2023-12-12
  • 詳解用python寫網(wǎng)絡(luò)爬蟲-爬取新浪微博評論

    詳解用python寫網(wǎng)絡(luò)爬蟲-爬取新浪微博評論

    這篇文章主要介紹了python爬取新浪微博評論,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 淺析python,PyCharm,Anaconda三者之間的關(guān)系

    淺析python,PyCharm,Anaconda三者之間的關(guān)系

    Python是一種跨平臺的計算機程序設(shè)計語言,簡單來說,python就是類似于C,Java,C++等,一種編程語言。這篇文章主要介紹了淺析python,PyCharm,Anaconda三者之間的關(guān)系,需要的朋友可以參考下
    2019-11-11

最新評論

明溪县| 绥芬河市| 营山县| 增城市| 靖江市| 宁南县| 海盐县| 延庆县| 黄龙县| 磐石市| 台北县| 南京市| 扎赉特旗| 交城县| 扶风县| 临泽县| 陆良县| 青河县| 德钦县| 贡觉县| 扶沟县| 兴化市| 元氏县| 麟游县| 青川县| 阳西县| 夏津县| 乌审旗| 永兴县| 乐清市| 昌邑市| 景泰县| 富源县| 扬中市| 小金县| 达拉特旗| 从江县| 安平县| 恩施市| 南投市| 阿城市|