1 def outer(func): 2 def inner(): 3 print("hello") 4 print("hello") 5 #func爲原f的函數 6 r=func() # r=none 7 print("end") 8 print("rend") 9 return r 10 return inner 11 @outer #裝飾器的本質將原函數封裝到新函數,執行outer函數,並縣城將其下面的的函數名作爲參數傳到到 12 #傳到func中,將outer的返回值從新賦值 給f1=outer的返回值 inner就是地 13 #只要應用裝飾器,函數就被從新定義,從新定義爲inner函數內層的函數 14 def f(): 15 16 print("F1") 17 f()
一個裝飾器執行過程,先將outer,f函數載入內存,當f()時候就執行@outer,將下面的f看成參數傳入outer函數,outer函數中又定義了一個inner函數,執行兩個print("hello") 接着執行func()這個其實就是調用原f()函數,將返回值 給r,沒有r返回none,接着執行下面函數
print("end")語句,當inner函數執行完後,面outer返回一個inner函數所在內存指的位置還不是帶有括號,不然執行,spa
內存有三塊函數,outer , inner,f分別指不三塊內存地址,當執行f()則outer(func)這個時func也指向f 所指的函數,至關於outer(f),執行時返回一個inner所指的函數,這個時候f()則換成inner()執行的函數,而在inner()函數中執行到func()則至關於f()執行,返回的值r接着在執行後面的語句,反回一個r值,其實就是至關於f()返回的值給了r
有參數的code
1 def outer(func): 2 def inner(a1,a2): 3 print("hello") 4 print("hello") 5 #func爲原f的函數 6 r=func(a1,a2) # r=none 7 print("end") 8 print("end") 9 return r 10 return inner 11 12 13 @outer 14 def f1(a1,a2): 15 return a1+a2 16 f1(1,2)
多個參數(有時傳一個,傳兩個,有時傳三個)blog
1 def outer(func): 2 def inner(*args): 3 print("hello") 4 print("hello") 5 #func爲原f的函數 6 r=func(*args) # r=none 7 print(r) 8 print("end") 9 print("end") 10 return r 11 return inner 12 @outer 13 def f1(a1,a2): 14 return a1+a2 15 f1(1,2)
多個參數,有字典內存
1 def outer(func): 2 def inner(*args,**kargs): 3 print("hello") 4 print("hello") 5 #func爲原f的函數 6 r=func(*args,**kargs) # r=none 7 print(r) 8 print("end") 9 print("end") 10 return r 11 return inner 12 @outer 13 def f1(a1,a2): 14 return a1+a2 15 f1(1,2)
多個裝飾器加在一個函數class
def outer0(func): def inner(*args,**kwargs): print("sbsb") r = func(*args,**kwargs) return r return inner def outer(func): def inner(*args,**kargs): print("hello") print("hello") #func爲原f的函數 r=func(*args,**kargs) # r=none print(r) print("end") print("end") return r return inner @outer0 #先執行第一個裝飾器 @outer #執行第二個裝飾器 def f1(a1,a2): return a1+a2 f1(1,2)
運行結果裝飾器
sbsb
hello
hello
3
end
enddi