# 最简单的装饰器,运行顺序
def w1(func):
print('装饰器正在装饰....')
print(func)
def inner():
print('正在进行权限验证...')
func() # f1()
return inner
@w1 # 执行到这里就会调用函数w1,并且将f1作为参数传递给w1,并把返回值inner函数赋值给f1
def f1():
print('正在运行f1...')
@w1
def f2():
print('正在运行f2...')
f1()
# 多个装饰器装饰同一个函数的运行顺序
def w1(func):
print('正在用w1进行装饰...')
print(func)
def inner():
print('正在运行w1.inner....')
return '[w1]' + func() + '[w1]'
return inner
def w2(func):
print('正在用w2进行装饰...')
print(func)
def inner():
print('正在运行w2.inner....')
return '[w2]' + func() + '[w2]'
return inner
@w1
@w2
def text():
print('正在运行被装饰的函数...')
return '流程验证'
print(text)
ret = text()
print(ret)
# 装饰的原函数有参数,那么闭包函数必须保持参数个数一致,并且将参数传递给原方法.
def w1(func):
print('正在装饰...')
def inner(haha):
print('正在运行闭包...')
func(haha)
return inner
@w1
def text(name):
print(f'我叫{name}')
text('李太白')
# 如果装饰的原函数有多个参数或不定长参数
def w1(func):
print('装饰中..')
def inner(*args): # 此处聚合
print('运行inner..')
func(*args) # 此处打散
return inner
@w1
def sum_(a, b, c):
print(sum([a, b, c]))
sum_(11, 12, 13)
# 对带返回值的函数进行装饰
def w1(func):
print('正在装饰...')
def inner(*args):
print('正在运行inner...')
return func(*args)
return inner
@w1
def sum_(a, b, c):
print('正在运行函数...')
return sum([a, b, c])
ret = sum_(1, 2, 3)
print(ret)
# 带参数的装饰器
def w1(name='齐天大圣'):
print(f'{name}正在运行w1....')
def w2(func):
print(f'{name}正在运行w2....')
def inner():
print(f'{name}正在运行inner....')
func()
return inner
return w2
@w1('猪八戒')
def text():
print('正在运行text...')
text()
# 万能装饰器
def wanneng(func):
def inner(*args, **kwargs):
return func(*args, **kwargs)
return inner
@wanneng
def text():
print('正在运行text..')
@wanneng
def text1(a):
print(a)
text()
text1(9)