zoukankan      html  css  js  c++  java
  • 作业 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()
    

    运行结果:

  • 相关阅读:
    黑盒测试和白盒测试的区别
    alpha测试和beta测试的区别
    selenium退出语句区别
    QTP8.2--安装流程
    Xshell无法连接Linux虚拟机问题
    Linux-----centos6.2---安装Linux的流程
    MySql错误处理--错误代码和消息
    基于Linux系统--web环境搭建
    前端底层-作用域 this 原型笔试题练习
    前端底层-冒泡与捕获
  • 原文地址:https://www.cnblogs.com/pythonwl/p/12552802.html
Copyright © 2011-2022 走看看