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('张三')
  • 相关阅读:
    npm run eslint 报错 (87 errors, 0 warnings potentially fixable with the --fix option.)
    vue 项目 webstrom IDE格式化代码规则遵循eslint设置
    VUE:Method definition shorthands are not supported by current JavaScript version解决办法(该方法定义的缺陷是不支持当前的JavaScript版本)
    Flex 布局全解
    前端解析ipa、apk安装包信息 —— app-info-parser
    微信小程序开发
    base64上传到oss
    jQuery 文档操作方法
    学习v-on的使用
    学习vue结合ajax查询出后台数据
  • 原文地址:https://www.cnblogs.com/dangrui0725/p/9433909.html
Copyright © 2011-2022 走看看