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))
posted on 2024-04-17 17:12  晓雾-Mist  阅读(3)  评论(0编辑  收藏  举报