一:编写函数,(函数执行时间用time.sleep(n)代表)
import time
def func():
print('from func')
time.sleep(1)
二:编写装饰器,为函数加上统计时间的功能
import time
from functools import wraps
def deco1(func1):
@wraps(func1)
def wrapper1(*args, **kwargs):
start_time = time.time()
res1 = func1(*args, **kwargs)
end_time = time.time()
print(f'{func1.__name__}的运行时间为{end_time - start_time}秒')
return res1
return wrapper1
三:编写装饰器,为函数加上认证的功能
import time
from functools import wraps
def deco2(func2):
@wraps(func2)
def wrapper2(*args, **kwargs):
inp_name = input('请输入您的用户名:').strip()
inp_pwd = input('请输入您的密码:').strip()
if inp_name == 'jason' and inp_pwd == '123':
res = func2(*args, **kwargs)
return res
else:
print('登录失败哦')
return wrapper2
四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval(’{“name”:“egon”,“password”:“123”}’)转成字典格式
login_user = None
db_dic = {}
login_time = 0
def login(): # 登录函数
with open('db.txt', mode='r', encoding='utf-8') as f:
for line in f:
dic = eval(line)
db_dic[dic['name']] = dic
i = 0
while i < 3:
inp_name = input('请输入您的用户名:').strip()
inp_pwd = input('请输入您的密码:').strip()
if inp_name in db_dic:
if inp_pwd == dic['inp_name']['password']:
print('登录成功!')
global login_time, login_user
login_user = inp_name
login_time = time.time()
return
else:
print('登录失败!')
i += 1
def deco3(func3): # 认证
@wraps(func3)
def wrapper3(*args, **kwargs):
while True:
if not login_user:
login()
else:
res3 = func3(*args, **kwargs)
return res3
return wrapper3
五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
import time
login_time = 0
def timer(func4):
def wrapper4(*args, **kwargs): # 登录计时
global login_time
flag = False
while True:
now_time = time.time()
if now_time > (login_time + 3600):
inp_name = input('请输入您的用户名:').strip()
inp_pwd = input('请输入您的密码:').strip()
with open('db.txt', mode='r', encoding='utf-8') as f:
for line in f:
name, pwd = line.strip('\n').split(':')
if inp_name == name and inp_pwd == pwd:
print('登录成功!')
flag = True
else:
res4 = func4(*args, **kwargs)
return res4
if flag:
login_time = time.time()
else:
print('登录失败!请重新登录')
return wrapper4
@timer
def home():
print('===home===')
六:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
func_dic = {}
func_list = []
def deco5(func5):
@wraps(func5)
# 先判断函数名在不在字典,如不在,就添加
def wrapper5(*args, **kwargs):
# 收录所有字典里的函数名
for v in func_dic.values():
func_list.append(v)
if func5.__name__ not in func_list:
num = len(func_dic) + 1
func_dic[str(num)] = func5.__name__
res = func5(*args, **kwargs)
return res
return wrapper5
@deco5
def home():
print('from home')
@deco5
def index():
print('from index')
home()
index()
print(func_dic)
七:编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
注意:时间格式的获取
import time
time.strftime(’%Y-%m-%d %X’)
import time
from functools import wraps
def log(func):
@wraps(func)
def wrapper(*args, **kwargs):
with open('access.log', mode='a', encoding='utf-8') as f:
f.write(f'{time.strftime("%Y-%m-%d %X")} {func.__name__} run\n')
res = func(*args, **kwargs)
return res
return wrapper
@log
def home():
print('====home====')
home()
time.sleep(1)
home()