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

    # 装饰器
    # 本质就是函数,为其它函数添加附加功能
    # 原则:1,不修改被修饰函数的源代码;2,不修改被修饰函数的调用方式
    # 装饰器=高阶函数+函数嵌套(在函数体内又定义函数)+闭包
    
    # 装饰器的简单框架
    def timer(func):
        def wrapper():
            # 加上需要的代码
            func()
            # 加上需要的代码
    
        return wrapper
    
    
    @timer  # @timer相当于test = timer(test)
    def test():
        print('test函数执行完毕')
    
    
    # test = timer(test) 这里返回的是wrapper的内存地址
    # test()  这里执行的是wrapper
    
    test()  # 运行test函数后,timer装饰器起作用
    
    
    # 装饰器加上返回值
    def timer(func):
        def wrapper():
            # 加上需要的代码
            res = func()
            # 加上需要的代码
            return res
    
        return wrapper
    
    
    # 装饰器加上参数
    def timer(func):
        def wrapper(*args, **kwargs):
            # 加上需要的代码
            res = func(*args, **kwargs)
            # 加上需要的代码
            return res
    
        return wrapper
    
    
    # 案例 在所有函数中加入验证登陆功能
    user_list = [
        {"name": "Alex", "pwd": "123"},
        {"name": "Joe", "pwd": "1234"},
        {"name": "Mark", "pwd": "12345"},
        {"name": "Flank", "pwd": "123456"}
    ]
    user_dic = {"username": None, 'login': False}
    
    
    def logincheck(func):
        def wrapper(*args, **kwargs):
            if user_dic["username"] and user_dic["login"]:
                res = func(*args, **kwargs)
                return res
            username = input('请输入用户名').strip()
            password = input('请输入密码').strip()
            for user in user_list:
                if username == user["name"] and password == user["pwd"]:
                    user_dic["username"] = username
                    user_dic['login'] = True
                    res = func(*args, **kwargs)
                    return res
    
            print('用户名或密码错误')
    
        return wrapper
    
    
    @logincheck
    def index():
        print('这里是主页')
    
    
    @logincheck
    def home(name):
        print('%s,欢迎回家' % name)
    
    
    @logincheck
    def shopping(name):
        print('%s,您的购物列表中有xxx' % name)
    
    
    index()
    home('张三')
    shopping('张三')
    
    
    # 装饰器加参数,上面案例再确定数据库类型,比如index是文件,home是mysql
    
    user_list = [
        {"name": "Alex", "pwd": "123"},
        {"name": "Joe", "pwd": "1234"},
        {"name": "Mark", "pwd": "12345"},
        {"name": "Flank", "pwd": "123456"}
    ]
    user_dic = {"username": None, 'login': False}
    
    
    def logincheck_auth(auth_type):
        def logincheck(func):
            def wrapper(*args, **kwargs):
                print('认证类型', auth_type)
                if auth_type == 'filedb':
                    if user_dic["username"] and user_dic["login"]:
                        res = func(*args, **kwargs)
                        return res
                    username = input('请输入用户名').strip()
                    password = input('请输入密码').strip()
                    for user in user_list:
                        if username == user["name"] and password == user["pwd"]:
                            user_dic["username"] = username
                            user_dic['login'] = True
                            res = func(*args, **kwargs)
                            return res
                elif auth_type == 'mysql':
                        print('这里是mysql进行操作的代码')
                else:
                        print('这里是其它认证方式的代码')
    
                print('用户名或密码错误')
    
            return wrapper
    
        return logincheck
    
    
    @logincheck_auth(auth_type='filedb')
    def index():
        print('这里是主页')
    
    
    @logincheck_auth(auth_type='mysql')
    def home(name):
        print('%s,欢迎回家' % name)
    
    
    @logincheck_auth(auth_type='other')
    def shopping(name):
        print('%s,您的购物列表中有xxx' % name)
    
    
    index()
    home('张三')
    shopping('张三')
  • 相关阅读:
    前端笔记之JavaScript(六)让人头疼的正则表达式
    前端笔记之JavaScript(五)关于数组和字符串那点事
    前端笔记之JavaScript(四)关于函数、作用域、闭包那点事
    前端笔记之JavaScript(三)关于条件判断语句、循环语句那点事
    前端笔记之JavaScript(二)关于运算符&初识条件判断语句
    前端笔记之CSS(下)浮动&BFC&定位&Hack
    前端笔记之CSS(上)语法&文本属性&块/行内元素&选择器&盒模型
    artTemplate--使用artTemplate时,由于json对象属性有数字命名格式 导致调用报错 syntax error
    多线程--做单元测试时,使用线程池发现并没有运行指定代码,直接跳过
    JSP-导入taglib 出现classNotFound异常
  • 原文地址:https://www.cnblogs.com/dangrui0725/p/9433909.html
Copyright © 2011-2022 走看看