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()
    

    运行结果:

  • 相关阅读:
    Django高级编程之自定义Field实现多语言
    Python魔法方法__getattr__和__getattribute__详解
    Python深入浅出property特性属性
    Python中使用__new__实现单例模式并解析
    Python中类方法、__new__方法和__init__方法解析
    Python中可迭代对象、迭代器以及iter()函数的两个用法详解
    Docker ubuntu apt-get更换国内源解决Dockerfile构建速度过慢
    Python抽象基类中__subclasshook__方法的使用并实现自己的虚拟子类
    Scrapy-redis分布式爬虫爬取豆瓣电影详情页
    PHP5.5+ APC 安装
  • 原文地址:https://www.cnblogs.com/pythonwl/p/12552802.html
Copyright © 2011-2022 走看看