python装饰器嵌套基础

1 python装饰器嵌套基础

python支持装饰器嵌套,即多个装饰器装饰同一个函数或方法。

1.1 嵌套执行顺序

用法

@a_deco
@b_deco
@c_deco
def test_nest_deco():
    pass

描述

@a_deco、@b_deco、@c_deco分别占一行,编写在同一个函数或方法的def语句上方。

从def开始,由近到远,依次执行装饰器@c_deco、@b_deco、@c_deco。

等价于

test_nest_deco=a_deco(b_deco(c_deco(test_nest_deco))))

示例

>>> def a_decorator(func):
    print('a_decorator 被调用')
    return func
>>> def b_decorator(func):
    print('b_decorator 被调用')
    return func
>>> def c_decorator(func):
    print('c_decorator 被调用')
    return func
>>> @a_decorator
@b_decorator
@c_decorator
def test_nest_deco():
    print('test_nest_deco 被调用')

    
c_decorator 被调用
b_decorator 被调用
a_decorator 被调用
>>> test_nest_deco()
test_nest_deco 被调用

1.2 嵌套返回调用对象

描述

装饰器的包装函数,比如a_wrapper(),保存接收到的入参函数,以便包装器调用。

最后执行的包装器a_decorator(),会将返回的包装器a_wrapper赋值给主函数变量名test_nest_deco。

调用主函数test_nest_deco()时,相当于调用最后的包装器a_wrapper()。

示例

>>> def a_decorator(func):
    print('a_decorator 被调用')
    def a_wrapper():
        print(func.__name__.center(50,'='))
        func()
        return '返回 a_decorator'
    return a_wrapper

>>> def b_decorator(func):
    print('b_decorator 被调用')
    def b_wrapper():
        print(func.__name__.center(50,'='))
        func()
        return '返回 b_decorator'
    return b_wrapper

>>> def c_decorator(func):
    print('c_decorator 被调用')
    def c_wrapper():
        print(func.__name__.center(50,'='))
        func()
        return '返回 c_decorator'
    return c_wrapper

>>> @a_decorator
@b_decorator
@c_decorator
def test_nest_deco():
    print('test_nest_deco 被调用')

    
c_decorator 被调用
b_decorator 被调用
a_decorator 被调用
>>> test_nest_deco()
====================b_wrapper=====================
====================c_wrapper=====================
==================test_nest_deco==================
test_nest_deco 被调用
'返回 a_decorator'
>>> test_nest_deco.__name__
'a_wrapper'

你可能感兴趣的:(python,python)