编写装饰器
一:编写函数,(函数执行的时间用time.sleep(n)模拟)
def func(num,price):
time.sleep(0.2)
print('您买的苹果价格为%s元'%(num*price))
return '苹果'
func(8,5)
二:编写装饰器,为函数加上统计时间的功能
import time
def timmer(func):
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' % (stop-start))
return res
return wrapper
@timmer
def shopping(num,price):
time.sleep(0.2)
print('您买的苹果价格为%s元'%(num*price))
return '购物愉快'
res1=shopping(8,9)
print('====>',res1)
三:编写装饰器,为函数加上认证的功能
import time
def auth(func):
def wrapper(*args,**kwargs):
role=input('请输入用户名').strip()
if role == 'juanfu':
res=func(*args,**kwargs)
return res
else:
exit()
return wrapper
@auth
def shopping(num,price):
time.sleep(0.2)
print('您买的苹果价格为%s元'%(num*price))
return '苹果'
res1=shopping(8,9)
print('====>',res1)
四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval(’{“name”:“egon”,“password”:“123”}’)转成字典格式
import time
login = False
def auth(func):
def wrapper(*args,**kwargs):
global login
if login:
res = func(*args, **kwargs)
return res
user = input('username>>:').strip()
pwd = input('password>>:').strip()
with open('user.txt', 'r', encoding='utf-8')as f:
str = f.read()
eval(str)
if user in str and pwd in str:
print('login successful')
login = True
res = func(*args,**kwargs)
return res
else:
print('user or password error')
return wrapper
@auth
def index(user):
time.sleep(0.3)
print('用户%s登录成功,欢迎来到每日新鲜'%user)
return 321
@auth
def shopping(num,price):
time.sleep(0.2)
print('您买的苹果价格为%s元'%(num*price))
return '苹果'
res1 = index('juanfu')
res2 = shopping(8,9)
print('===>',res1)
print('===>',res2)
五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
不会
六:编写装饰器,为多个函数加上记录日志的功能:函数一旦运行则按照下述格式记录日志
函数开始执行的时间 函数名 返回值
2020-06-18 12:13:38 index 456
2020-06-18 12:13:39 home 123
提示:
统计时间time.strftime('%Y-%m-%d %H:%M:%S')
函数名func.__name__
self
import time
def auth(func):
def wrapper(*args,**kwargs):
with open('db.txt',mode='a',encoding='utf-8')as f:
f.write('%s:%s\n'% ((func.__name__),time.strftime('%Y-%m-%d %H:%M:%S')))
res=func(*args,**kwargs)
return wrapper
@auth
def shopping(num,price):
time.sleep(0.2)
print('您买的苹果价格为%s元'%(num*price))
return '苹果'
@auth
def index(user):
time.sleep(0.3)
print('用户%s登录成功,欢迎来到每日新鲜'%user)
return 321
res1 = index('juanfu')
res2 = shopping(8,9)
print('===>',res1)
print('===>',res2)
reference
import time
def logger(func):
def wrapper(*args, **kwargs):
start_time = time.strftime("%Y-%m-%d %H:%M:%S")
res = func(*args, **kwargs)
with open('run.log', mode='at', encoding='utf-8') as f:
f.write("%s %s %s\n" % (start_time, func.__name__, res))
return res
return wrapper
@logger
def index():
time.sleep(1)
print("from index")
return 123
@logger
def home(name):
time.sleep(0.5)
print("from home")
return 456
index()
home("egon")