前置知識:
- 函數的本質就是變量名
- 可以把函數作為參數傳遞,例如:
def func():print("我是func")# 接收的fn是個函數
def handle(fn):
# 調用函數fn()handle(func)
- 可以把函數作為返回值返回,例如
def func():def func2():print("我是func2")# func2函數作為返回值return func2fn = func()
fn()
閉包
閉包:內層函數對外層函數的變量的使用
作用1:讓一個變量被外部訪問,但是不能修改
作用2:讓一個變量常駐內存
def func():a = 10def inner():print(a)return areturn inner# 函數外部訪問到了變量a
fn = func()
fn()
裝飾器
本質: 裝飾器的本質就是一個函數,該函數的參數是被裝飾的函數,返回值是裝飾后的函數
作用: 裝飾器可以在不改變原有代碼的基礎上,給函數添加新的功能
一、裝飾器雛形(理解)
裝飾器雛形
def wrapper(fn):def inner():print("執行被裝飾函數之前")fn()print("執行被裝飾函數之后")return innerdef add():print("我是add")# 向wrapper函數傳入了add函數,返回的函數命名為add
add = wrapper(add) # 裝飾器的關鍵語句!!!
add() # 這里執行add()相當于執行inner(),因為wrapper返回的是inner函數
裝飾器雛形用語法糖的形式寫
def wrapper(fn):def inner():print("執行被裝飾函數之前")fn()print("執行被裝飾函數之后")return inner@wrapper # 用語法糖/裝飾器的寫法應該這么寫,等價于執行add = wrapper(add)
def add():print("我是add")add() # 這里執行add()相當于執行inner(),因為wrapper返回的是inner函數
二 、通用裝飾器(重點記住)
通用裝飾器的固定寫法如下:
(wrapper、inner、fn都是可以隨意命名的,并非固定的)
def wrapper(fn):# *args和**kwargs用于接受被裝飾函數的參數def inner(*args, **kwargs):"""在被裝飾函數之前執行的操作"""# 注意:這里的*和**是將args和**kwargs打散傳遞給fn函數ret = fn(*args, **kwargs) # 被裝飾函數"""在被裝飾函數之后執行的操作"""return ret # 處理被裝飾函數的返回值return inner
三、高階裝飾器(理解)
即同一個函數被多個裝飾器裝飾
四、帶參數的裝飾器(理解)
舉例: