day14作业

这篇博客介绍了Python装饰器的实战应用,包括模拟函数执行时间、统计函数运行时间、实现认证功能以及记录日志。装饰器用于在不修改原有函数代码的基础上,增加额外的功能,如自动计时、用户认证和日志管理。同时,讨论了如何从文件读取用户信息进行认证,并实现登录超时机制。
摘要由CSDN通过智能技术生成

一:编写函数,(函数执行的时间用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")



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值