定义: 装饰器用于装饰某个函数,可让函数在执行前或执行后执行某些操做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()