裝飾器
定義裝飾器本身是乙個可呼叫物件,接收乙個函式作為引數,然後將其返回或替換成另乙個函式或可呼叫物件。可以理解成,原來那是一堵白牆,經過了一層裝飾,這層裝飾可能是漆也可能把牆掏空鑲進一層**變得金光閃閃,最後呈現在你眼前的就是裝飾後的樣子。
可以把它完全當成常規函式來呼叫,其引數是另乙個函式。裝飾器有兩大特徵,一是能把被裝飾的函式替換成其他函式,二是裝飾器在載入函式時立即執行。
def read_oil(func):
print("ready to paint!")
def red_wall_func():
print("red wall")
return red_wall_func
@read_oil
def wall():
print("wall!")
if __name__=="__main__":
print("start painting")
wall()
輸出ready to paint!
start painting
red wall
可以看出,裝飾器red_oil
將函式wall
替換成了另乙個函式,就好比在原來的牆上刷了一層紅漆。而裝飾器在被裝飾的函式被定義時立即執行,而被裝飾的函式在執行的時候才執行,這也是匯入時和執行時的區別。
函式中變數的作用範圍
red_paint="red oil"
def wall(paint):
print(paint)
global red_paint
print(red_paint)
if __name__ == '__main__':
wall("yelloow oil")
輸出yelloow oil
red oil
nonlocal宣告
nonlocal
宣告,作用是將變數標記為自由變數,也就意味著我們可以對做了nonlocal
宣告的變數進行修改
def wall():
nums=0
oils=
def paint_wall(color):
nonlocal nums
nums +=1
print("paint wall by color:"+color)
print("paint wall {} times".format(nums))
return oils
return paint_wall
if __name__ == '__main__':
white_wall=wall()
white_wall("red")
white_wall("yellow")
輸出paint wall by color:red
paint wall 1 times
paint wall by color:yellow
paint wall 2 times
帶引數的裝飾器
既然裝飾器本質上就是乙個函式,那裝飾器也可以傳參。那麼具體應該怎麼做呢?在 python 中需要建立乙個裝飾器工廠函式,把引數傳給它,再返回乙個裝飾器,然後應用到要裝飾的函式上。
Python高階函式 裝飾器
由於函式也是乙個物件,而且函式物件可能被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2018 4 11 f now f 2018 4 11 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...
Python函式 裝飾器高階
1.對擴充套件是開放的 為什麼要對擴充套件開放呢?我們說,任何乙個程式,不可能在設計之初就已經想好了所有的功能並且未來不做任何更新和修改。所以我們必須允許 擴充套件 新增新功能。2.對修改是封閉的 為什麼要對修改封閉呢?就像我們剛剛提到的,因為我們寫的乙個函式,很有可能已經交付給其他人使用了,如果這...
PYTHON高階函式和裝飾器
定義 裝飾器的本質是函式,用來裝飾其他的函式,為其他的函式新增功能。函式修飾符 用做函式的修飾符,可以在模組或者類的定義層內對函式進行修飾,出現在函式定義的前一行,不允許和函式定義在同一行乙個修飾符就是乙個函式,它將被修飾的函式作為引數,並返回修飾後的同名函式或其他可呼叫的東西 原則 1 不能修改被...