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

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

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

閉包

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

閉包需要滿足如下3個(gè)條件:

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

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

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

示例:

在這里插入圖片描述

裝飾器

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

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

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

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

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

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

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

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

多個(gè)裝飾器

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

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

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

帶參數(shù)的裝飾器

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

  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ù)的裝飾器被打在某個(gè)函數(shù)上時(shí),比如@logging(level=‘DEBUG’),它其實(shí)是一個(gè)函數(shù),會(huì)馬上被執(zhí)行,只要這個(gè)它返回的結(jié)果是一個(gè)裝飾器時(shí),那就沒問題。

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

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

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

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

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

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

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

那么用類來實(shí)現(xiàn)也是也可以的。我們可以讓類的構(gòu)造函數(shù)__init__()接受一個(gè)函數(shù),然后重載__call__()并返回一個(gè)函數(shù),也可以達(dá)到裝飾器函數(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ù)的類裝飾器

如果需要通過類形式實(shí)現(xiàn)帶參數(shù)的裝飾器,那么會(huì)比前面的例子稍微復(fù)雜一點(diǎn)。那么在構(gòu)造函數(shù)里接受的就不是一個(gè)函數(shù),而是傳入的參數(shù)。通過類把這些參數(shù)保存起來。然后在重載__call__方法是就需要接受一個(gè)函數(shù)并返回一個(gè)函數(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ù),而是類對象。 在了解這個(gè)裝飾器前,你需要知道在不使用裝飾器怎么寫一個(gè)屬性。

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

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

@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è)置方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python實(shí)現(xiàn)五子棋算法

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

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

    python進(jìn)程管理工具supervisor的安裝與使用教程

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

    用python建立兩個(gè)Y軸的XY曲線圖方法

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

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

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

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

    這篇文章主要介紹了python使用回溯算法實(shí)現(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實(shí)現(xiàn)合并多個(gè)Excel文件

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

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

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

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

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

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

最新評論

米易县| 蓝田县| 卓尼县| 平阴县| 新乡市| 东乡族自治县| 普陀区| 寿阳县| 武清区| 武乡县| 积石山| 永胜县| 荥阳市| 全椒县| 读书| 太和县| 房产| 富蕴县| 项城市| 区。| 新闻| 巴林右旗| 龙海市| 武穴市| 宜兰市| 保靖县| 泾源县| 精河县| 仪征市| 名山县| 临夏市| 都江堰市| 潢川县| 上栗县| 曲阜市| 辉县市| 丘北县| 同仁县| 特克斯县| 和林格尔县| 应城市|