一:编写函数,(函数执行时间用time.sleep(n)代表)
import time
from functools import wraps
def timmer(n):
time.sleep(n)
print('=====>',n)
二:编写装饰器,为函数加上统计时间的功能
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print(f'运行时间:{stop-start}')
return res
return wrapper
@outter
def timmer(n):
time.sleep(n)
print('=====>',n)
timmer(3)
三:编写装饰器,为函数加上认证的功能
def authenticate(func):
@wraps(func)
def wrapper(*args,**kwargs):
while True:
name=input('name:').strip()
pwd=input('pwd:').strip()
if name=='egon'and pwd=='123':
print('登录成功!')
break
else:
print('账号密码错误')
res = func(*args, **kwargs)
return res
return wrapper
@authenticate
def timmer(n):
time.sleep(n)
print('=====>',n)
timmer(1)
四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
with open('db.txt','r',encoding='utf-8')as f:
for line in f:55
info_dic=eval(line)
name=input('name:')
pwd=input('pwd:')
if name in info_dic and pwd==info_dic[name][0]:
print('登录成功')
break
else:
print('账号密码错误')
continue
res=func(*args,**kwargs)
return res
return wrapper
@outter
def timmer(n):
time.sleep(n)
print('=====>',n)
timmer(1)
五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
with open('db.txt','r',encoding='utf-8')as f:
for line in f:
info_dic=eval(line)
while True:
name = input('name:')
pwd = input('pwd:')
if name in info_dic and pwd == info_dic[name][0]:
print('登录成功')
info_dic[name][1] = time.time() + 3
res = func(*args, **kwargs)
if time.time() > info_dic[name][1]:
continue
return res
else:
print('账号密码错误')
return wrapper
@outter
def timmer(n):
time.sleep(n)
print('=====>',n)
timmer(4)
八:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
九 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X')
import time
def foo(file):
def outter(func):
def wrapper(*args,**kwargs):
t = time.strftime('%Y-%m-%d %X')
func(*args, **kwargs)
with open(r'%s'%file,'a',encoding='utf-8')as f:
f.write('f1日志写入时间:%s\n'%t)
print(f)
return wrapper
return outter
@foo(file='access.log')
def f1():
print(1)
time.sleep(1)
f1()