作业13

一:编写函数,(函数执行的时间用time.sleep(n)模拟)
二:编写装饰器,为函数加上统计时间的功能
三:编写装饰器,为函数加上认证的功能

import time
def auth_timmer(func):
    def inner(*args,**kwargs):
        useranme=input('请输入你的账号:').strip()
        password=input('请输入你的密码:').strip()
        if useranme=='zc' and password=='123':
            print('登陆成功,正在跳转...')
            start=time.time()
            res=func(*args,**kwargs)
            stop=time.time()
            print(stop-start)
            return res
        else:
            print('登录失败!')

    return inner

@auth_timmer
def index():
    time.sleep(3)
    print('我很牛逼')
index()

四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式

user_info={}
flag=False
def login(func):
    def inner(*args, **kwargs):
        global flag  # 给函数内的全局变量赋值
        if flag:
            ret = func(*args, **kwargs)
            return ret

        else:
            username = input('输入你的名字:')
            password = input('输入你的密码:')
            with open('a.txt', mode='r', encoding='utf-8') as f:
                for line in f:
                    user, pwd = line.strip().split(':')
                    user_info[user] =pwd
                if username == user_info and password == user_info.get(username):
                    flag = True
                    ret = func(*args, **kwargs)  # func就是被装饰的函数
                    return ret
                else:
                    print('错误,登录失败')

    return inner


@login
def check_money():  # 两个函数有不同的功能
    print('我没钱')


@login
def withdraw():
    print('说了我没钱')


check_money()
withdraw()

五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录

import time
user={'user':None,'login_time':None,'timeout':0.000003,}
def timmer(func):
    def wrapper(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs)
        stop=time.time()
        print('{}'.format(stop-start))
        return res
    return wrapper
def auth(func):
    def wrapper(*args,**kwargs):
        if user['user']:
            timeout=time.time()-user['login_time']
            if timeout < user['timeout']:
                return func(*args,**kwargs)
        name=input('账号: ').strip()
        password=input('密码>>: ').strip()
        if name == 'zc' and password == '123':
            user['user']=name
            user['login_time']=time.time()
            res=func(*args,**kwargs)
            return res
    return wrapper
@auth
def check_money():  # 两个函数有不同的功能
    print('我没钱')


@auth
def withdraw():
    print('说了我没钱')


check_money()
withdraw('zc')
posted @ 2020-03-23 17:48  小子,你摊上事了  阅读(82)  评论(0)    收藏  举报