流暢的python第七章函數裝飾器和閉包學習記錄

來源:互聯網
上載者:User

標籤:com   調用函數   rap   local   常見   技術分享   stat   判斷   fun   

本章討論的話題

python如何計算裝飾器句法

python如何判斷變數是不是局部的(通過函數內部是否給變數賦值過來判斷是否是局部變數)

閉包存在的原因和工作原理(閉包是一種函數,它會保留定義函數時存在的自由變數的綁定,這樣調用函數時,雖然定義範圍不可用了,但是仍能使用那些綁定。函數中的函數)

nonlocal能解決什麼問題(nonlocal是新出現的保留關鍵字,python3.0中引入)(將局部變數聲明為自由變數)

探討

實現行為良好的裝飾器

標準庫中有用的裝飾器

實現一個參數化的裝飾器

 

裝飾器的基礎知識

裝飾器是可調用的對象,其參數是另一個函數即被裝飾的函數,裝飾器可能會處理被裝飾的函數,然後將它發返回,或者將其替換成另一個函數或可調用對象。

@decoratedef target():    print("running target()")以上方法效果同下def target():    print("running target()")target = decorate(target)

裝飾器的一個特性是能把被裝飾的函數替換成其他函數,第二個特性是,裝飾器在載入模組是立即執行。

裝飾器通常在一個模組中定義,然後應用到其他模組的函數上,並且會在內部定義一個函數,然後將其返回

變數範圍規則

在上面的例子中我們定義了一個全域變數b,在函數中給b賦值,導致python判斷b是局部變數,我們只定義了全域變數b,沒有定義局部變數b,所以報錯。可以通過使用global關鍵詞將b當成全域變數

 

 

 

LOAD_GLOBAL載入全域變數,LOAD_FAST載入局部變數

 閉包

閉包指的是延伸了範圍的函數,其中包含函數定義體中引用,但是不在定義體中定義的非全域變數。函數是不是匿名的沒有關係,關鍵是能訪問定義體之外的非全域變數

綜上,閉包是一種函數,它會保留定義函數是存在的自由變數的綁定,這樣調用函數時,雖然定義範圍不可用了,但是仍能使用那些綁定。

nonloal聲明

函數中的局部變數,雖然可以被函數中的函數使用,但是如果使用了指派陳述式,就需要將該局部變數定義成自由變數,nonloal的作用就是把變數標記為自由變數。

Python2中沒有nonlocal但是可以通過將聲明一個變數指向局部變數來對其賦值

實現簡單的裝飾器

標準庫中的裝飾器

python內建了三個用於裝飾方法的函數,property,clasmethod和staticmethod

另一個常見的裝飾器是functools.wraps,作用是協助構建行為良好的裝飾器。

單指派泛函數

疊放裝飾器

 使用兩個或者多個裝飾器

參數化裝飾器

 

流暢的python第七章函數裝飾器和閉包學習記錄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.