装饰器原理
定义: 装饰器用于装饰某个函数,可以让函数在执行前或执行后执行某些操作
@outer: 1、执行outer函数,并将其下面的函数名赋值给outer的参数
2、将outer的返回值重新赋值给f1
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() #1、遇到outer函数放到内存 #2、遇到@outer 执行outer函数,把@outer下面的函数名当做参数执行outer函数, #3、把outer的返回值inner重新赋值给f #4、现在执行f()就相当于执行inner #5、执行inner,先print("222") #6、再执行func ,这里的func是原来的函数f()既print("000") #7、再执行print("333") #8、返回一个原来函数的返回值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 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()
二、装饰器不在类中
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()