python----------装饰器应用练习
- 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),
要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')
转成字典格式
- 定义一个字典看用户登录状态
- auth_status={
- 'user':None,
- 'status':False#状态是没有登录
- }
- def wrapper(fun):
- def inner(*args,**kwargs):
- if auth_status['status']:#如果登录了,就执行fun函数
- ret = fun(*args, **kwargs) # index/home
- return ret
- else:#如果没有登录,就实现认证功能
- username = input('name:>>').strip()#获取用户名
- password = input('password:>>').strip()#获取密码
- f=open('login.txt','r',encoding='utf-8')#打开文件获取用户的信息
- user_dic=f.read()#读出来的是字符串类型
- zhddict=eval(user_dic)#转换成字典类型
- #print(type(zhddict))#查看eval转换后的类型
- if zhddict.get(username) and password == zhddict[username]:#如果用户名和密码都正确,就显示登陆成功,不正确就显示登录失败
- print('login successful')
- auth_status['user']=username #登陆成功后就把用户名放在user里
- auth_status['status']=True 状态改为True
- ret = fun(*args,**kwargs)#index/home
- return ret
- else:
- print('login faild')
- return inner
- @wrapper #语法糖
- def index():
- print("欢迎来到首页")
- @wrapper
- def home():
- print("欢迎回家")
- index()
- index()
- home()
- index()
2.编写下载网页内容的函数,
要求功能是:用户传入一个url,函数返回下载页面的结果
编写装饰器,实现缓存网页内容的功能:
具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,
否则,就去下载,然后存到文件中
- from urllib.request import urlopen
- url_l=[]#存放
- def huancun(func):
- '''
- 实现缓存网页内容的功能
- '''
- def inner(*args,**kwargs):#args传的就是url,那么得到url就得用url = args[0]
- url = args[0] # 取url
- filename=str(hash(url))#用hash算法吧url转换为数字作为文件名,但是数字不能作为文件名,必须转换成str类型
- if url in url_l:#如果url已经在列表里了,就说明你已经下载过了,就不需要在执行func了,就直接打开就行了
- f=open(filename,'rb')
- ret=f.read()
- else:#如果不在列表里就要把添加到url列表
- url_l.append(url)
- ret = func(*args, **kwargs)
- f=open(filename,'wb')#打开文件
- f.write(ret)#并且用写的方式把它写进文件里
- f.close()
- return ret
- return inner
- @huancun#get=huancun(get)
- def get(url):#定义一个get函数
- return urlopen(url).read()#返回读取的网页
- print(get('http://www.people.com.cn'))
- print(get('http://www.people.com.cn'))#调用get方法,传一个'http://www.people.com.cn'网址进去
- print(get('http://www.people.com.cn'))
python----------装饰器应用练习的更多相关文章
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
- python装饰器方法
前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...
随机推荐
- Struts 框架 之 Hello World
Struts HelloWorld 第一步 导jar包 commons-fileupload-1.2.2.jar [文件上传相关包] commons-io-2.0.1.jar [输入输 ...
- 深入浅析JavaScript中的constructor
constructor 属性返回对创建此对象的数组函数的引用.本文给大家介绍JavaScript中的constructor ,需要的朋友参考下吧 定义和用法 constructor 属性返回对创建此对 ...
- Health Check in eShop -- 解析微软微服务架构Demo(五)
引言 What is the Health Check Health Check(健康状态检查)不仅是对自己应用程序内部检测各个项目之间的健康状态(各项目的运行情况.项目之间的连接情况等),还包括了应 ...
- Android Bitmap 常见的几个操作:缩放,裁剪,旋转,偏移
Android Bitmap 相关操作 常见的几个操作:缩放,裁剪,旋转,偏移 很多操作需要 Matrix 来支持:Matrix 通过矩阵来处理位图,计算出各个像素点的位置,从而把bitma ...
- linux shell变量$#,$@,$0,$1,$2的含义解释
变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 ...
- 大三仍是Linux系统小白的我给大家讲讲学习历程
我与Linux结缘是在大三的时候.我与Linux熟识是在偶然遇到<Linux就该这么学>的时候.因为我是电子信息工程专业,在高年级时开设了嵌入式课程,嵌入式系统是一种专用的计算机系统,作为 ...
- *更新*无需root,一条命令强制全屏模式
未root的系统,必须通过pc端运行adb命令进行设置,因此请开启开发者选项中的adb调试模式,用usb连接电脑和手机,运行下面的代码强制开启全屏模式,立即生效:全屏沉浸: adb shell set ...
- (转)ORACLE中SID和SERVICE_NAME的区别
背景:之前一直分不清plsql和程序中配置文件url之间的连接,想当然的认为service_name 和jdburl后面的实例相对应,直到出错的这一天,通过这篇博客,彻底扫除了盲点. 1 问题 1.1 ...
- 【JAVASCRIPT】React学习-如何构建一个组件
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 组件化思想 组件就是 UI + UI 交互逻辑,组件有三个常规map , 分别为state 状态 . props 数据 ...
- 【Django】Django与jinja的不同
1. http://jinja.pocoo.org/docs/dev/switching/#django 目前已了解的不同: 1) 某元素是否存在 if xxx Django if xxx is ...