欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python学习-43 装饰器 -- 函数闭包2

程序员文章站 2022-06-14 17:15:19
函数闭包为函数加上认证功能 1.登陆账号 运行结果: 2.检测已有账号登陆 运行结果: ......

函数闭包为函数加上认证功能

 

1.登陆账号

user_dic ={'username':none,'login':false}

def auth_func(func):
    def wrapper(*args,**kwargs):


        if user_dic['username'] and user_dic['login']:
            res = func(*args,**kwargs)
            return res

        username = input('账号:').strip()
        passwd = input('密码:').strip()
        if username == 'abcd' and passwd == '123456':
            user_dic['username'] = username
            user_dic['login'] = true
            print('登陆成功!')
            res=func(*args,**kwargs)
            return res
        else:
            print('用户名或密码错误')
    return wrapper

@auth_func
def index():
    print('欢迎光临本网站')


@auth_func
def home(name):
    print('欢迎%s回家' % name)



index()
home('小明')

运行结果:

账号:abcd
密码:123456
登陆成功!
欢迎小明回家

process finished with exit code 0

 

2.检测已有账号登陆

 

user_list=[{'name':'abcd','passwd':'123456'},
           {'name':'abd','passwd':'123'},
           {'name':'acc','passwd':'123456'},
           {'name':'asdfg','passwd':'12346'}
]
user_dac ={'username':none,'login':false}           # 获取刚开始登陆之前的状态

def auth_func(func):
    def wrapper(*args,**kwargs):

        if user_dac['username'] and user_dac['login']:   # 获取刚开始登陆之前的状态,是否已登录
            res = func(*args,**kwargs)
            return res

        username = input('账号:').strip()
        passwd = input('密码:').strip()
        for user_dic in user_list:
            if username == user_dic['name'] and passwd == user_dic['passwd']:
                user_dac['username'] = username
                user_dac['login'] = true
                print('登陆成功!')
                res=func(*args,**kwargs)
                return res
        else:
            print('用户名或密码错误')
    return wrapper

@auth_func
def index():
    print('欢迎光临本网站')


@auth_func
def home(name):
    print('欢迎%s回家' % name)



index()
home('sb')

运行结果:

账号:abd
密码:123
登陆成功!
欢迎光临本网站
欢迎sb回家

process finished with exit code 0