- # 最简单的装饰器,运行顺序
- 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)