• 第十二天(叠加装饰器和迭代器)


    第十二天(叠加装饰器和迭代器)

    '''
    叠加装饰器:
    在同一个被装饰对象,添加多个装饰器,并执行。
    @装饰1
    @装饰2
    @装饰3
    def 被装饰对象():
      pass
    注意:装饰器在调用被装饰对象才会执行添加的功能。
    叠加装饰器:
    装饰的顺序:由下到上装饰
    执行顺序:由上到下
    注意:无论inner中出现任何判断,最后都要返回'调用
    后的被装饰对象'fenc(*args, **kwargs)
    '''

    # 模板
    # def wrpper(func):
    #     def inner(*args, **kwargs):
    #         # 注册
    #         res = func(*args, **kwargs)
    #         # 登录
    #         return res
    #     return inner


    # 为被装饰对象,添加统计时间 与 登录认证功能

    import time
    user_info = {
       'user':None
    }
    # 登录功能
    def login():
       # 判断用户没有登录时,实行
       username = input('输入账号:').strip()
       password = input('输入密码:').strip()
       with open(f'z.txt','r',encoding='utf-8')as f:
           for line in f:
               print(line)
               name, pwd = line.strip(' ').split(':')
               # 字符串切分返回列表
       if username == name and password == pwd:
           print('登录成功')
           user_info['user'] = username
           return True
       else:
           print('登录失败')
           return False


    # 登录认证装饰器
    def login_auth(func):
       def inner1(*args, **kwargs):

           '''
          无论inner中出现人和判断,
          最后都要返回'调用后的被装饰对象' funs(*args, **kwargs)
          '''
           # 登录认证
           if user_info.get('user'):
               res = func(*args, **kwargs)
               return res
           else:
               flag = login()
               # 添加用户是否登录判断
               if flag:
                   res = func(*args, **kwargs)
                   return res
               else:
                   login()
                   return func(*args, **kwargs)

       return inner1

    # 统计时间装饰器
    def time_record(func):
       def inner2(*args, **kwargs):
           k_time = time.time()
           res = func(*args, **kwargs)
           j_time = time.time()
           print(f'消耗时间为:{j_time - k_time}')
           return res
       return inner2
    # 下载电影功能
    '''
      - 叠加装饰器:
          - 装饰的顺序: 由下到上装饰
          - 执行的顺序: 由上往下
    '''
    @login_auth
    @time_record
    # @login_auth
    def download_movie():
       print('正在下载电影。。。')
       time.sleep(2)
       print('下载完成。。。')
       return

    download_movie()


    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()

    # 有参装饰器
    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




    # 被装饰对象
    # @user_auth('SVIP')
    wrapper = user_auth('普通用户')
    @wrapper
    # @user_auth('SVIP') # wrapper = user_auth('普通用户')
    @wrapper  #<--- 返回结果(wrapper) <---- user_auth()
    def index():
       pass
    index()











  • 相关阅读:
    vue项目index.html缓存
    vue刷新当前页面
    keep-alive
    JS刷算法题:二叉树
    CSS动效集锦,视觉魔法的碰撞与融合(三)
    算法:栈和队列题目集合(一)
    浅谈设计模式(二):装饰器模式|中介模式|原型模式
    聊聊JS的二进制家族:Blob、ArrayBuffer和Buffer
    浅谈设计模式(一):状态模式|外观模式|代理模式
    纵论WebAssembly,JS在性能逆境下召唤强援
  • 原文地址:https://www.cnblogs.com/zhangjinyi97/p/11857279.html
Copyright © 2020-2023  润新知