一、带参数的装饰器,函数的有用信息
def func1(): '''此函数的功能是完成的登陆的功能 return: 返回值是登陆成功与否(true,false) ''' print(333) func1() print(func1.__name__)#func1 print(func1.__doc__)#此函数的功能是完成的登陆的功能,return: 返回值是登陆成功与否
打印函数名
from functools import wraps def wrapper(f): @wraps(f) def inner(*args,**kwargs):
#函数运行之前的操作 ret = f(*args,**kwargs)
#执行函数之后的操作 name = f.__name__ print(name) return ret return inner @wrapper def func1(): print(666) func1()
二、带参数的装饰器
给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
import time def wrapper(func): def inner(*args,**kwargs): struct_time = time.localtime() time_now = time.strftime("%Y-%m-%d %H:%M:%S",struct_time) with open('log',encoding = 'utf-8',mode = 'a')as f: f.write('在%s时间,执行了%s函数 '%(time_now,func.__name__)) ret = func(*args,**kwargs) '''函数操作之后''' return ret return inner @wrapper def func1(): print(6660) func1()
在编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码。这个作业之上进行升级操作:
设置两套密码,一套为京东账号密码,一套为淘宝账号密码保存在文件中。
设置四个函数,分别代表 京东首页,京东超市,淘宝首页,淘宝超市。
循环打印四个选项:东首页,京东超市,淘宝首页,淘宝超市。
供用户选择,用户输入选项后,执行该函数,四个函数都加上认证功能,只要登陆成功一次,在选择其他函数,后续都无需输入用户名和密码。
相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。
dic = { 'username':None, 'status':False, } def login(flag): def wrapper(func): def inner(*args,**kwargs): if dic['status']: ret = func(*args,**kwargs) return ret else: count = 0 while count<3: username = input('请输入你的用户名:').strip() password = input('请输入你的密码').strip() with open('msg2',encoding = 'utf-8')as f: msg_dic= eval(f.readline()) if username == msg_dic[flag]['username'] and password == msg_dic[flag]['password']: dic['username'] = username dic['status'] = True ret = func(*args,**kwargs) return ret else: print('您输入的用户名或者密码错误,请从新输入,还有%s次机会' %(2-count)) count+= 1 return inner return wrapper @login('微信') def taobao_home(): print('淘宝首页') @login('qq') def JD_home(): print('京东首页') choice_dict={ 1:taobao_home, 2:JD_home, } while True: print('1 淘宝首页 2 京东首页') choice_num = input('请选择输入的序号:').strip() if choice_num.isdigit(): choice_num = int(choice_num) if 0 < choice_num <= len(choice_dict): choice_dict[choice_num]() else: print('请输入范围内的序号') else: print('您输入的有非法字符,请从新输入')