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

     装饰器
    开闭原则:
    对功能的扩展开放
    对代码的修改是封闭
        通用装饰器语法:
    
        def wrapper(fn):
            def inner(*args, **kwargs): # 聚合
                在目标函数之前
                ret = fn(*arg, **kwargs) # 打散
                在目标函数之后
                return ret
            return inner
    
        @wrapper
        def func():
            pass
    
        func()
    

      

    带参数的装饰器
    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
    

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

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

      装饰器的应用

    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 i 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("输入有误. 请重新选择!")
    

      



  • 相关阅读:
    三、Pandas入门
    二、NumPy入门
    jQuery模拟angular的数据绑定
    ajax里的getJSON的用法
    SQL中关于传递参数为Null的示例
    原生ajax示例
    页面自增加示例
    angular1数据绑定例子
    angular2 工程目录结构介绍
    angular js环境配置
  • 原文地址:https://www.cnblogs.com/YangWenYu-6/p/10187572.html
Copyright © 2011-2022 走看看