作业 3/23

一:编写函数,(函数执行的时间用time.sleep(n)模拟)

def func():
    import time
    start = time.time()
    time.sleep(3)
    end = time.time()
    print(end - start)
func()

二:编写装饰器,为函数加上统计时间的功能

def outter(func1):
    def func():
        import time
        start = time.time()
        func1()
        end = time.time()
        print(end - start)
    return func

@outter
def func1():
    print(100)

func1()

三:编写装饰器,为函数加上认证的功能

def outter(func1):
    def func(*args,**kwargs):
        user = input('请输入账号:').strip()
        pwd = input('请输入密码:').strip()
        if user == 'egon' and pwd == '123':
            print('登陆成功')
            func1()
        else:
            print('登陆失败')
            return None
    return func

@outter
def func2():
    print('登录程序执行了')

func2()

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

def outter(func):
    def wrapper():
        global login
        if not login:
            user = input('请输入账号:').strip()
            pwd = input('请输入密码:').strip()
            with open('tank.txt','r',encoding='utf-8') as f:
                for line in f:
                    d1 = eval(line.strip())
                    if user == d1['name'] and pwd == d1['password']:
                        print('登陆成功')
                        login = True
                        func()
                        break
                else:
                    print('登陆失败')
        else:
            func()
    return wrapper

@outter
def fun1():
    print('提现功能')

@outter
def fun2():
    print('转账功能')

@outter
def fun3():
    print('特殊功能')

login = False

fun1()
fun2()
fun3()

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


def outter(func):
    def wrapper():
        global login
        if os.path.exists('login.txt'):
            with open('login.txt','r',encoding='utf-8') as f1:
                l = f1.read()
                if float(l) < time.time():
                    login = False

        if not login:
            if os.path.exists('login.txt'):
                os.remove('login.txt')
            user = input('请输入账号:').strip()
            pwd = input('请输入密码:').strip()
            with open('tank.txt','r',encoding='utf-8') as f:
                for line in f:
                    d1 = eval(line.strip())
                    if user == d1['name'] and pwd == d1['password']:
                        print('登陆成功')
                        with open('login.txt','w',encoding='utf-8') as f5:
                            f5.write(str(time.time() + 10))
                        login = True
                        func()
                        break
                else:
                    print('登陆失败')
        else:
            func()
    return wrapper

@outter
def fun1():
    print('提现功能')

@outter
def fun2():
    print('转账功能')

@outter
def fun3():
    print('特殊功能')


login = False

import os,time
fun1()
fun2()
time.sleep(11)
fun3()

六:选做题
思考题(选做),叠加多个装饰器,加载顺序与运行顺序,可以将上述实现的装饰器叠加起来自己验证一下

def deco1(func):
    def swapper():
        func()
        print(1)

    return swapper


def deco2(func):
    def swapper():
        func()
        print(2)

    return swapper


def deco3(func):
    def swapper():
        func()
        print(3)

    return swapper


@deco1  # index=deco1(deco2.wrapper的内存地址)
@deco2  # deco2.wrapper的内存地址=deco2(deco3.wrapper的内存地址)
@deco3  # deco3.wrapper的内存地址=deco3(index)
def index():
    pass


index()

猜你喜欢

转载自www.cnblogs.com/pythonwl/p/12552802.html