• 装饰器


    装饰器
    开闭原则:
    对功能的扩展开放
    对代码的修改是封闭
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    通用装饰器语法:
     
    def wrapper(fn):
        def inner(*args, **kwargs): # 聚合
            在目标函数之前
            ret = fn(*arg, **kwargs) # 打散
            在目标函数之后
            return ret
        return inner
     
    @wrapper
    def func():
        pass
     
    func()

      

    带参数的装饰器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def wrapper_out(参数):
                def wrapper(fn):
                    def inner(*args, **kwargs): # 聚合
                        在目标函数之前
                        ret = fn(*arg, **kwargs) # 打散
                        在目标函数之后
                        return ret
                    return inner
                return wrapper
     
            @wrapper_out(实参)  # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
            def func():
                pass

      多个装饰器装饰同一个函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 就近原则
    @wrapper1
    @wrapper2
    @wrapper3
    def func():
        print("我是可怜的func")
     
    func()
    # 1 2 3  func 3 2 1

      装饰器的应用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    menu = ("查看""添加""修改""删除""退出")
     
    flag = False  # 没登录
     
     
    def login():
        global flag
        username = input("请输入用户名:")
        password = input("请输入密码:")
        if username == "alex" and password == "123":
            flag = True
            print("登录")
        else:
            flag = False
            print("用户名密码错误")
     
     
    # 登录验证装饰器
    def login_verify(fn):
        def inner(*args, **kwargs):
            # 登录校验
            while 1:
                if flag == True:
                    ret = fn(*args, **kwargs)
                    return ret
                else:
                    print('对不起, 您还没有登录')
                    login()
        return inner
     
    def chakan():
        print("==============================查看")
     
    @login_verify
    def tianjia():
        print("============================添加")
     
    @login_verify
    def xiugai():
        print("=======================修改")
     
    @login_verify
    def shanchu():
        print("=========================删除")
     
     
    while 1:
        for in range(len(menu)):
            print(i+1, menu[i])
     
        num = input("请输入你要执行的菜单:")
        if num == "1":
            chakan()
        elif num == "2":
            tianjia()
        elif num == "3":
            xiugai()
        elif num == "4":
            shanchu()
        elif num == "5":
            print("程序退出中..........")
            exit()
        else:
            print("输入有误. 请重新选择!")

      

  • 相关阅读:
    Qt中不同类型数据之间的相互转换
    数组传参
    sizeof和strlen区别
    打印字符‘烫’
    vivado hls(1)
    时序约束方法(2)
    FPGA浮点数定点化
    FPGA设计思想与技巧(转载)
    视频采集显示总结
    Verilog code
  • 原文地址:https://www.cnblogs.com/heheda123456/p/10202008.html
Copyright © 2020-2023  润新知