python高级语法(装饰器)

发布时间:2024年01月23日

装饰器

1.引出装饰器:

在函数执行前输出 before ,在函数执行之后输出after

最原始代码:
def func():
    print('before')           # 直接输出即可
    print('我是func函数')
    print('after')
    value = (11, 22, 33)
    return value

res = func()
print(res)
变复杂点:

闭包。调用outer函数,将func引用传给origin,接着将inner函数再重新传递给func,此时执行func函数,其实执行的就是inner函数

,就是执行的origin函数,这个origin函数是func的引用,到底是执行的还是原来的func

def func():
    print('我是func函数')
    value = (11, 22, 33)
    return value

def outer(origin):    
    def inner():
        print('before')
        res = origin()
        print('after')
        return res
    return inner

func = outer(func)
res = func()
print(res)
再复杂点:

装饰器本质代码 ----> func = outer(func),就是将func函数作为参数,然后传到outer中,然后再赋值给func

def outer(origin):
    def inner():
        print('before')
        res = origin()
        print('after')
        return res

    return inner

@outer
def func():
    print('我是func函数')
    value = (11, 22, 33)
    return value


res = func()
print(res)
最终答案

如果需要装饰的函数比较多,那么一个一个写不是最明智的写法,装饰器可以简便操作。

def outer(origin):
    def inner():
        print('before')
        res = origin()
        print('after')
        return res

    return inner

@outer
def func1():
    print('我是func1函数')
    return

@outer
def func2():
    print('我是func2函数')
    return

@outer
def func3():
    print('我是func3函数')
    return

func1()
func2()
func3()
对最终答案进行优化

可支持任意参数的情况, 引入 *args, **kwargs

def outer(origin):
    def inner(*args, **kwargs):
        print('before')
        res = origin(*args, **kwargs)
        print('after')
        return res

    return inner

@outer
def func1(a):
    print('我是func1函数')
    return

@outer
def func2(a, b):
    print('我是func2函数')
    return

@outer
def func3(a, b, c):
    print('我是func3函数')
    return

func1(1)
func2(1, 2)
func3(1, 2, 3)
文章来源:https://blog.csdn.net/m0_64046173/article/details/135777912
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。