標籤: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第七章函數裝飾器和閉包學習記錄