zoukankan      html  css  js  c++  java
  • 装饰器补充

    叠加装饰器

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

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

    '''
    叠加装饰器:
        在同一个被装饰对象中,添加多个装饰器,并执行。
        @装饰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__
  • 相关阅读:
    linux 安装 Chrome
    J2EE版本
    Java 源码解析之局部变量检查
    /etc/xinetd.conf 和 /etc/xinetd.d/*【新网络服务配置】
    Linux 内核编译
    linux 汇编
    /etc/ethers【地址映射】
    Linux LAMP 搭建
    Linux ftp 使用
    linux apache
  • 原文地址:https://www.cnblogs.com/lvguchujiu/p/11852092.html
Copyright © 2011-2022 走看看