- # 今日作业:
- # 默写:
- # 开闭原则
- # 什么样的函数称为闭包
- # python 中什么是装饰器
- # 装饰器的两个原则
- #
- #
- # 一: 编写函数,(函数执行的时间是随机的)
- # import time
- # import random
- # def time1():
- # print('you are D,S,B')
- # time.sleep(random.random())
- # 二: 编写装饰器, 为函数加上统计时间的功能
- # import time
- # import random
- # def outter(func):
- # def wrapper(*args,**kwargs):
- # start=time.time()
- # res=func(*args,**kwargs)
- # stop=time.time()
- # print('run time:%s' %(stop-start))
- # return res
- # return wrapper
- # @outter
- # def time1():
- # print('you are D,S,B')
- # time.sleep(random.random())
- #
- # time1()
- # 三: 编写装饰器, 为函数加上认证的功能
- # def outter(func):
- # def wrapper(*args,**kwargs):
- # name=input('用户名:')
- # pwd=input('密码:')
- # if name=='egon' and pwd=='123':
- # print('登录成功')
- # #在调用函数前加功能
- # res=func(*args,**kwargs) #调用被装饰的 \ 也就是最原始的那个函数
- # #在调用函数后加功能
- # return res
- # else:
- # print('用户名或密码错误')
- # return wrapper
- # 四: 编写装饰器, 为多个函数加上认证的功能 (用户的账号密码来源于文件), 要求登录成功一次, 后续的函数都无需再输入用户名和密码
- # 注意: 从文件中读出字符串形式的字典, 可以用 eval('{"name":"egon","password":"123"}') 转成字典格式
- # from functools import wraps
- import time
- def auth(func):
- # @wraps
- def wrapper(*args,**kwargs):
- while True:
- name=input('用户名:')
- pwd=input('密码:')
- with open ('db1.txt',mode='r',encoding='utf-8') as f:
- for line in f:
- line=line.strip('\n')
- line=eval(line)
- if name in line['name']:
- if line['pwd']==pwd:
- print('登录成功')
- res=func(*args,**kwargs)
- return res
- else:
- print('密码错误')
- else:
- print('用户名不存在')
- return wrapper
- @auth
- def index():
- print('.......')
- time.sleep(4)
- index()
- # 五: 编写装饰器, 为多个函数加上认证功能, 要求登录成功一次, 在超时时间内无需重复登录, 超过了超时时间, 则必须重新登录
- # 六: 编写下载网页内容的函数, 要求功能是: 用户传入一个 url, 函数返回下载页面的结果
- #
- # 七: 为题目五编写装饰器, 实现缓存网页内容的功能:
- # 具体: 实现下载的页面存放于文件中, 如果文件内有值 (文件大小不为 0), 就优先从文件中读取网页内容, 否则, 就去下载, 然后存到文件中
- #
- # 扩展功能: 用户可以选择缓存介质 / 缓存引擎, 针对不同的 url, 缓存到不同的文件中
- #
- # 八: 还记得我们用函数对象的概念, 制作一个函数字典的操作吗, 来来来, 我们有更高大上的做法, 在文件开头声明一个空字典, 然后在每个函数前加上装饰器, 完成自动添加到字典的操作
- #
- # 九 编写日志装饰器, 实现功能如: 一旦函数 f1 执行, 则将消息 2017-07-21 11:12:11 f1 run 写入到日志文件中, 日志文件路径可以指定
- # 注意: 时间格式的获取
- # import time
- # time.strftime('%Y-%m-%d %X')
来源: http://www.bubuko.com/infodetail-2723208.html