装饰器是将一个函数镶嵌在另一个函数中进行重复使用的目的,增加函数的使用方式,但是不用写过多冗余的代码:
1.最简单的装饰器
b只是一个对象,并不会运行,然后当运行到c()的时候,相当于给了b执行的
#kwargs将参数打包为dict给函数使用,将传入的a=1这样的参数变为{'a':1}
我们这里相当于 a(c(a,b))这个函数
对象d,e,这里从输出可以看出
当我们赋予c参数时,运行d,e,运行的时候是从上往下的
我们先运行e()函数,输出1,运行到func()的时候会停下
跳转到同样的d()函数开始运行,输出a,运行到func()会执行c()函数
第二层得到 e()对d()进行装饰
哇擦擦!我真聪明。。。这装饰器真能装啊,差点就晕了
懂没懂!清不清楚!瞬间想通,多个装饰器不就是这个装饰器对上一个装饰器的装饰嘛
1.最简单的装饰器
def a(func):
print(1)
def b():
print(2)
func()
print(3)
return b
@a
def c():
print(4)
c()
当程序运行时:先执行@a,得到一个1和函数的对象b,b和b()是不一样的
b只是一个对象,并不会运行,然后当运行到c()的时候,相当于给了b执行的
参数,然后我们会执行2,func()得到4,3,到这里程序结束
运行结果:
2.当加入参数的装饰器,是这样的:
def a(func):
print(1)
def b(*args,**kwargs):
print(2)
func(*args,**kwargs)
print(3)
return b
@a
def c(a,b):
print(a+b)
c(3,4)
#args 将参数打包为tuple给函数使用(3,4)
#kwargs将参数打包为dict给函数使用,将传入的a=1这样的参数变为{'a':1}
我们这里相当于 a(c(a,b))这个函数
所有这里的b()其实就相当于c()
运行结果:
3.当使用多个参数的装饰器时:
def a(func):
print('i\'m a!')
def e():
print(1)
func()
print(2)
return e
def b(func):
print('i\'m b!')
def d():
print('a')
func()
print('b')
return d
@a
@b
def c():
print('!!!!!')
c()
想了很久,首先有两个装饰器的时候,会自下而上的运行,砸门会得到两个
对象d,e,这里从输出可以看出
当我们赋予c参数时,运行d,e,运行的时候是从上往下的
我们先运行e()函数,输出1,运行到func()的时候会停下
跳转到同样的d()函数开始运行,输出a,运行到func()会执行c()函数
最后输出b,在输出2
结果:
经过我不断注释掉d和e里面的func,经过深思之后得到:
def e():
print(1)
def d():
print('a')
c()
print('b')
return d
print(2)
第二层得到 e()对d()进行装饰
哇擦擦!我真聪明。。。这装饰器真能装啊,差点就晕了
懂没懂!清不清楚!瞬间想通,多个装饰器不就是这个装饰器对上一个装饰器的装饰嘛