装饰器

# 装饰器
# 本质就是函数,为其它函数添加附加功能
# 原则: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('张三')

 

posted @ 2018-08-06 22:30  四十不惑的编程之路  阅读(114)  评论(0编辑  收藏  举报