1. 程式人生 > 其它 >7.1 學習日記

7.1 學習日記

今日內容

裝飾器是一個用來被裝飾者新增功能的工具

被裝飾者:函式

裝飾器:可以用函式事先裝飾器這種工具

無參裝飾器
無參裝飾器模板
from functools import wraps
def otter()
#finc原函式的地址這裡是(lndex)
@wraps(finc)
#把內建屬性覆蓋給裝飾器,裝的更像
def wrapper(*args,**kwargs):
#將原函式需要的值一模一樣的還給他
res = finc(*args,**kwargs)
#將原函式的返回值賦值給res
return res
#返回原函式的返回值

return wrapper
#返回wrapper的記憶體地址,


@otter #函式語法糖(要呼叫裝飾器,要把裝飾器寫在上面)
def index(x): #原函式
print(x)
return 4546
裝飾器語法糖
@後面跟一個函式的記憶體地址,python會自動觸發這個函式的執行,將正下方的那個函式的記憶體地址當作引數傳進來,將返回值返回給原函式名

from functools import wraps
@wraps:把內建屬性覆蓋給裝飾器(加在裝飾器裡)
疊加多個裝飾器:載入順序與執行順序
@deco1  #列印111
@deco2 #列印222
@deco3 #列印333
def index(x): #原函式
print(x)
return 4546


結果是
111
222
333

載入順序是從下往上
執行順序是從上往下


載入順序:先載入最下面的裝飾器,把原函式的記憶體地址載入到func3,返回wrapper3的地址。
再載入deco2,把wrapper3的記憶體地址載入到func2,定義wrapper2,返回wrapper2的地址。
再載入deco1,把wrapper2的記憶體地址載入到func1,定義wrapper1,返回wrapper1的地址。
把wrapper1的記憶體地址返回給了原函式(index)


執行順序:呼叫index就是呼叫wrapper1,執行wrapper1,再執行wrapper2,再執行wrapper3,最後執行原函式(index)
有參函式裝飾器
如果最內側的函式還需要輸入一個值,但是已經沒辦法改原始碼了,那就再裝飾的最外層加上,但是這樣語法糖就沒有辦法使用了。

語法糖怎麼使用呢?在普通語法糖的後面加上括號輸入最外層函式需要的值。

無參裝飾器模板
from functools import wraps

def outter(x,y)
#finc原函式的地址這裡是(lndex)
@wraps(finc)
#把內建屬性覆蓋給裝飾器,裝的更像
def wrapper(*args,**kwargs):
#將原函式需要的值一模一樣的還給他
res = finc(*args,**kwargs)
#將原函式的返回值賦值給res
return res
#返回原函式的返回值

return wrapper
#返回wrapper的記憶體地址,


@outter(111,222)
def index(x,y): #原函式
print(x,y)
return 4546