定義: 裝飾器用於裝飾某個函數,可讓函數在執行前或執行後執行某些操做python
@outer: 一、執行outer函數,並將其下面的函數名賦值給outer的參數函數
二、將outer的返回值從新賦值給f1blog
def outer(func): def inner(): print("222") print("222") r=func() print("3333") print("3333") return r return inner @outer def f(): print("000") r=f() #一、遇到outer函數放到內存 #二、遇到@outer 執行outer函數,把@outer下面的函數名當作參數執行outer函數, #三、把outer的返回值inner從新賦值給f #四、如今執行f()就至關於執行inner #五、執行inner,先print("222") #六、再執行func ,這裏的func是原來的函數f()既print("000") #七、再執行print("333") #八、返回一個原來函數的返回值r給inner就是如今的f
講裝飾器在類中的實現首先就是應該弄明白的就是裝飾器的參數傳遞,在上面的例子的裝飾器裏面是沒有參數的,可是在實際運用的過程當中參數是必不可少的,由上面的例子咱們知道裝飾器至關於把函數重新定義的結果,讓原函數執行裝飾器中的函數僞造出一種結果,因此原函數的參數必須和裝飾器內層函數的參數個數一致。因爲裝飾器用於裝飾不一樣的函數,因此參數是不必定的,可是咱們能夠用一個‘萬能’的參數來代替。內存
def outer(func): def inner(*args,**kwargs): print("222") print("222") r=func(*args,**kwargs) print("3333") print("3333") return r return inner @outer def f(a1,a2): print("000") r=f(1,2) #這裏傳的參數必須和f函數的參數個數一致
到此咱們就不難理解裝飾器應用於函數中了class
1、裝飾器在類中原理
class A(object): def outer(func): def inner(self): print("222") r=func(self) print("3333") return r return inner @outer def f(self): print("000") obj = A() obj.f()
2、裝飾器不在類中object
def outer(func): def inner(self): print("222") r=func(self) print("3333") return r return inner class S(object): @outer def f(self): print("000") a = S() a.f()