装饰器补充

叠加装饰器

  每一个新的功能都应该写一个新的装饰器

  否则会导致,代码冗余,结构不清晰,可扩展性差

'''
叠加装饰器:
    在同一个被装饰对象中,添加多个装饰器,并执行。
    @装饰1
    @装饰2
    @装饰3
    def 被装饰对象():
        pass

    注意: 装饰器在调用被装饰对象时才会执行添加的功能。

    - 叠加装饰器:
        - 装饰的顺序: 由下到上装饰
        - 执行的顺序: 由上往下

    注意: 无论inner中出现任何判断,最后都要返回“调用后的被装饰对象” func(*args, **kwargs)

'''
def wrapper(func):
    def inner(*args, **kwargs):
        # 注册
        res = func(*args, **kwargs)
        # 登录
        return res

    return inner
def wrapper1(func):
    def inner1(*args, **kwargs):
        print('1---start')
        # 被装饰对象在调试时,如果还有其他装饰器,会先执行其他装饰器中的inner
        # inner2
        res = func(*args, **kwargs)
        print('1---end')
        return res
    return inner1


def wrapper2(func):
    def inner2(*args, **kwargs):
        print('2---start')
        res = func(*args, **kwargs)
        print('2---end')
        return res
    return inner2


def wrapper3(func):
    def inner3(*args, **kwargs):
        print('3---start')
        res = func(*args, **kwargs)
        print('3---end')
        return res
    return inner3

'''
叠加装饰器的装饰顺序与执行顺序:
    - 装饰顺序: 调用wrapper装饰器拿到返回值inner
        由下往上装饰
        
    - 执行顺序: 调用装饰过后的返回值inner
        由上往下执行
'''


@wrapper1  # index《---inner1 = wrapper1(inner2)
@wrapper2  # inner2 = wrapper2(inner3)
@wrapper3  # inner3 = wrapper3(index)
def index():  # 被装饰对象   # inner1 ---》
    print('from index...')


# 正在装饰
inner3 = wrapper3(index)
inner2 = wrapper2(inner3)
inner1 = wrapper1(inner2)


'''
inner1()
inner2()
inner3()
index()
'''
index()  # 此处执行 # inner1() --> inner2() ---> inner3()

有参装饰器

#有参装饰器: 在某些时候,我们需要给用户的权限进行分类

'''

以下是有参装饰器

@wrapper1(参数1) # inner1 = wrapper1(inner2)

@wrapper2(参数2) # inner2 = wrapper2(inner3)

@wrapper3(参数3)

'''

# 有参装饰器
def user_auth(user_role):  # 'SVIP'
    def wrapper(func):
        def inner(*args, **kwargs):
            if user_role == 'SVIP':
                # 添加超级用户的功能
                res = func(*args, **kwargs)
                return res
            elif user_role == '普通用户':
                print('普通用户')
                # 添加普通用户的功能
                res = func(*args, **kwargs)
                return res

        return inner
    return wrapper


# 被装饰对象
# @user_auth('SVIP')
wrapper = user_auth('普通用户')
@wrapper
# @user_auth('SVIP')  # wrapper = user_auth('普通用户')
@wrapper  #<--- 返回结果(wrapper) <---- user_auth()
def index():
    pass
'''
wraps: (了解)
    是一个修复工具,修复的是被装饰对象的空间。
    from functools import wraps

'''
from functools import wraps


def wrapper(func):

    @wraps(func)  # 修改名称空间: inner ---》 func
    def inner(*args, **kwargs):
        '''
        此处是装饰器的注释
        :param func:
        :return:
        '''
        res = func(*args, **kwargs)
        return res
    return inner  # ---》 func


@wrapper
def index():
    '''
    此处是index函数的注释
    :return:
    '''
    pass


print(index)  # 函数对象

# 函数对象.__doc__: 查看函数内部的注释
print(index.__doc__)  # inner.__doc__

 

posted @ 2019-11-13 19:36  Parado  阅读(141)  评论(0编辑  收藏  举报