• python装饰器练习


    1、编写装饰器,为多个函数加上认证功能(用户的账户密码来源文件)
    要求登录成功一次,后续的函数都无需再输入用户名和密码
    flag = False
    def login(func):
        def inner(*args,**kwargs):
            global flag
            """登录程序"""
            if flag:
                ret = func(*args,**kwargs)
                return ret
            else:
                username = input('you name: ')
                password = input('you password:')
                if username == 'dj' and password == '123':
                    flag = True
                    ret = func(*args, **kwargs)
                    return ret
                else:
                    print('logining error')
        return inner
    
    @login                  # shopListAdd = login(shopListAdd)
    def shopListAdd():
        print('增加物品')
    
    @login
    def shopListDel():
        print('删除物品')
    
    shopListAdd()
    shopListDel()
    
    
    2、编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件
    def log(func):
        def inner(*args,**kwargs):
            with open('log',mode='a',encoding='utf-8') as f:
                f.write(func.__name__+'
    ')
            ret = func(*args,**kwargs)
            return ret
        return inner
    
    @log                    # shopListAdd = log(shopListAdd)
    def shopListAdd():
        print('增加一件物品')
    
    @log                    #shopListDel = log(shopListDel)
    def shopListDel():
        print('删除一件物品')
    
    shopListAdd()
    shopListDel()
    
    
    1.编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
    2.为题目1编写装饰器,实现缓存网页内容的功能:
    具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中
    import os
    from urllib.request import urlopen
    def cache(func):
        def inner(*args,**kwargs):
            if os.path.getsize('web_cache'):
                with open('web_cache','rb') as f:
                    return f.read()
            ret = func(*args,**kwargs)  #get()
            with open('web_cache','wb') as f:
                f.write(b'*********'+ret)
            return ret
        return inner
    
    @cache
    def get(url):
        code = urlopen(url).read
        return code
    
    ret = get('http://www.baidu.com')
    print(ret)
    
    
    
     
    
    
    
    
  • 相关阅读:
    高性能队列设计
    线上 RTT 有 1/3 概率超过 3 秒,我用 arthas 查出元凶!
    你管这破玩意儿叫 token
    高可用与Zookeeper设计原理
    从应用层到网络层排查 Dubbo 接口超时全记录
    我是如何晋升专家岗的
    百亿数据,毫秒级返回,如何设计?--浅谈实时索引构建之道
    微信的原创保护机制到底是如何实现的
    AOP面试造火箭始末
    与一位转行做滴滴司机的前程序员对话引发的思考
  • 原文地址:https://www.cnblogs.com/jsit-dj-it/p/11312646.html
Copyright © 2020-2023  润新知