11.装饰器
【一】装饰器
1)介绍
1.概念
在不改变原函数代码和调用方式的基础上增加额外的新功能
2.用途
对上线的程序进行新功能的增加与修改
给一个功能添加新的需求或改变原来程序的运行逻辑
3.分类
有参装饰器 无参装饰器
2)无参装饰器
def outer(func):
def inner():
...
res = func()
...
return res
return inner
eg = outer(func=eg)
eg() #eg是原有函数 现等同于inner(),即拓展完的eg函数
带参数会报错
3)有参装饰器
def outer(func):
def inner(*args, **kwargs):
...
res = func(*args, **kwargs)
...
return res
return inner
eg = outer(func=eg)
eg() #eg是原有函数 现等同于inner(),即拓展完的eg函数
4)无参语法糖
def outer(func):
def inner(*args, **kwargs):
...
res = func(*args, **kwargs)
...
return res
return inner
# 装饰器内函数无参语法糖
@outer
def index():
...
index()
# 装饰器内函数有参语法糖
@outer
def index(参数):
...
index('参数')
5)有参语法糖
def decrator(tag):
def outer(func):
def inner(*args, **kwargs):
if tag == 'a'
...
res = func(*args, **kwargs)
...
return res
elif tag == 'b'
...
res = func(*args, **kwargs)
...
return res
return inner
return outer
@decrator(tag = 'a')
@decrator(tag = 'b')
ef index(参数):
...
index('参数')
6)多层语法糖案例
- 多层语法糖的时候谁在下先调用谁,但是执行校验的时候是谁在上先校验谁
def dec_a(func):
# 【二】调用 dec_a 函数触发
print('111')
def wrapper(*args, **kw):
# 【三】执行 main_func()
print('222')
func(*args, **kw) # b_wrapper(main_func)
# 【七】结束上面的 b_wrapper 回来
print('333')
return wrapper
def dec_b(func):
# 【一】进来 dec_b 函数
print('aaa')
def wrapper(*args, **kw):
# 【四】因为在 dec_a 的 wrapper 里面调用了 func --> 就是我自己
print('bbb')
func(*args, **kw) # main_func
# 【六】执行完 main_func 又回来继续走
print('ccc')
return wrapper
# 多层语法糖的时候谁在下先调用谁,但是执行校验的时候是谁在上先校验谁
@dec_a
@dec_b
def main_func():
# 【五】回到真正的 main_func
print('main_func')
'''
# aaa
# 111
# 222
# bbb
# main_func
# ccc
# 333
'''
main_func()
7)伪装装饰器
1.通过help函数查看函数内部的注解
def outer(func):
def inner(*args, **kwargs):
...
res = func(*args, **kwargs)
...
return res
return inner
@outer
def index():
print('***')
print(help(index))
2.伪装装饰器()
def outer(func):
#伪装内存函数
@outer(func)
def inner(*args, **kwargs):
...
res = func(*args, **kwargs)
...
return res
return inner
@outer
def index():
print('***')
print(help(index))