一层装饰器的形成************
def wrapper1(func):
def inner1(*args,**kwargs):
print(1)
func(*args,**kwargs)
print(11)
return inner1
@wrapper1
def foo():
print(8)
@wrapper1这个魔法堂的意思就是个伪装:把@下面的函数(也就是待装饰的函数名)当做参数传进@后面的函数里,
再伪装成被装饰的函数的样子拿出来用
装饰器组成的过程:
间接可以使wapper()内的inner1()函数可以调用,进而使被装饰的函数在函数中体现出来。
整理整个装饰器的思路,想要执行被函数包裹的被装饰的函数,首先要把主函数调用起来,否则根本进不去,
首先写个wrapper1(foo)(),为什么要写个foo呢?是因为主函数里面的函数想要调用被装饰的函数那一定要把被装饰的函数引进去,
所以就先把这个foo函数名(存放了函数的地址)放在主函数里传进去,待供内部函数使用,进而找机会把foo()函数调用起来(函数+()就能执行函数的调用)
wrapper1(foo)()是可以调动起整个函数了,但是还差伪装成foo()的样子那如果想要硬生生写成foo()那怎么办呢?wrapper1(foo)()=foo()?
inner1函数启动了才能把我们的被装饰函数调用起来,但是要启动inner1必须要先启动wrapper1这个函数才行(因为wrapper能利用return 把) 进而启动了函数函数inner1()执行了被装饰函数;而foo只能变成inner1然后加()才能调用起被执行的函数,
name就得把foo变成inner1才行,inner1是wrapper1()的返回值,那就是把wrapper1()函数调用起来就能得到inner1了:wrapper1()==inner1
那我还得让inner1里面能调用我们之前的foo()函数怎么办,是不是要把foo(函数地址)传进去?
那就是wrapper1(foo)==inner 那我找随便一个 *“名字”=wrapper1(foo)再加上一个()就成功的调用起了inner1函数了,
那为了和被装饰的函数(foo())保持一样的壳子那就把这个“名字”换成foo,这样就构成了和被装饰函数(foo())外形一模一样的新函数
foo()了,保证了形式上的一致。
** ** ** ** ** ** ** ** ** ** ** 两层装饰器的形成 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
def wrapper1(func):
def inner1(*args,**kwargs):
print(1)
func(*args,**kwargs)
print(11)
return inner1
def wrapper2(func):
def inner2(*args,**kwargs):
func(*args, **kwargs)
print(22)
return inner2
# @wrapper1
# @wrapper2
def foo():
print(8)
这个的意思就是在装饰器的上面再加一个装饰器
按照语法的步骤就是先把@wrapper1下面的函数装饰起来,但是下面的也是一个被@wrapper2装饰的函数,那么肯定要先把@wrapper2这个装饰器弄明白才行啊,
那么@wrapper2就是把wrapper2(foo)赋值给名字foo,即foo = wrapper2(foo),那么要执行到被装饰函数就得写成foo()(即原函数wrapper2(foo)())才能执行,
那么还以这个形式就得把wrapper2函数当做一个函数再次被wrapper1装饰一下同理是不是要把wrapper2(foo)传进wrapper1中啊即wrapper1(wrapper2(foo))然后再执行即()
wrapper1(wrapper2(foo))()
** ** ** ** ** ** ** ** ** ** ** 三层装饰器的形成 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
def wrapper1(func):
def inner1(*args,**kwargs):
print(1)
func(*args,**kwargs)
print(11)
return inner1
def wrapper2(func):
def inner2(*args,**kwargs):
func(*args, **kwargs)
print(22)
return inner2
def wrapper3(func):
def inner3(*args,**kwargs):
print(3)
func(*args, **kwargs)
print(33)
return inner3
# @wrapper1
# @wrapper2
# @wrapper3 # 等同于 wrapper1(wrapper2(wrapper3(foo)))()
def foo():
print(8)
带参数的装饰器
设置一个标识符号
flag = True
def auth(arg):
def func(f):
def inner(*args,**kwargs):
if flag:
print('装饰一下')
return f()
# print('再来一下')
else:
f()
return inner
return func
@auth(flag)
def foo():
print('这是一个背账的')
foo()