裝飾器

 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

相關文章
相關標籤/搜索