python中的装饰器练习

可紊 提交于 2019-12-01 16:51:24
一:编写装饰器,为多个函数加上认证的功能(用户的账号密码)   要求登录成功一次,后续的函数都无需输入用户名和密码FLAG=False#此时还未登录 全局变量   写这个步骤的意义在于:方便 知道已经登录成功了,就不再重复登录def login(func):#为多个函数加上的认证功能    def inner(*args,**kwargs):#加上装饰器        global FLAG#给函数内的全局变量赋值        if FLAG:            ret = func(*args, **kwargs)  # func就是被装饰的函数            return ret    #'''写登录程序'''        else:            username=input('亲输入你的名字:')            password=input('亲输入你的密码:')            if username=='lxx' and password=='123':                FLAG=True                ret=func(*args,**kwargs)     #func就是被装饰的函数                return ret            else:                print('错误,登录失败')    return inner@logindef shoplist_add():  #两个函数有不同的功能    print('增加一件物品')@logindef shoplist_del():    print('删除一件物品')shoplist_add()shoplist_del()二:编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件def log(func):    def inner(*args,**kwargs):        with open('log','a',encoding='utf-8') as f:            f.write(func.__name__)#每次调用函数都将被调用的函数名称写入文件        ret=func(*args,**kwargs)        return ret    return inner@logdef shoplist_add():  #两个函数有不同的功能    print('增加一件物品')@logdef shoplist_del():    print('删除一件物品')shoplist_add()shoplist_del()三:进阶作业:   1.编写下载网页内容的函数,要求功能是:用户传入一个URL,函数返回下载页面的结果   2.为题目一编写装饰器,实现缓存网页内容的功能   3.具体:实现下载的页面存放与文件中,如果文件内有值(文件大小不为零),就优先从文件中读取网页内容import osfrom urllib.request import urlopendef cache(func):    def inner(*args,**kwargs):        if os.path.getsize('log'):#查看文件大小 如果不为零为 判断文件中是否有内容            with open('log','rb') as f:                return f.read()        ret=func(*args,**kwargs)#请求网页的函数        with open('log','wb') as f: #wb不需要encoding='utf-8'            f.write(b'****vfd**' + ret)  #下载的页面存放在文件中  将请求的结果写入文件        return ret    return inner@cachedef get(url):    code=urlopen(url).read    return coderet=get('https://shimo.im/docs/VN0BLgAIBdMVSa4S/read')print(ret)ret=get('https://shimo.im/docs/VN0BLgAIBdMVSa4S/read')print(ret)ret=get('https://shimo.im/docs/VN0BLgAIBdMVSa4S/read')print(ret)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!