首页 > 其他 > 详细

装饰器补充

时间:2019-11-13 20:21:18      阅读:64      评论:0      收藏:0      [点我收藏+]

叠加装饰器

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

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

‘‘‘
叠加装饰器:
    在同一个被装饰对象中,添加多个装饰器,并执行。
    @装饰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__

 

装饰器补充

原文:https://www.cnblogs.com/lvguchujiu/p/11852092.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!