一:编写函数,(函数执行的时间用time.sleep(n)模拟)
import time
def interesting(x, y):
time.sleep(3)
print(f'fascinating {x} and sexy {y}')
interesting('python', y='who')
二:编写装饰器,为函数加上统计时间的功能
import time
# 装饰器
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print(stop - start)
return res
return wrapper
# 被装饰对象
@timer
def interesting(x, y):
time.sleep(3)
print(f'fascinating {x} and sexy {y}')
return 'who are you ?'
res = interesting('python', y='who')
print(res)
三:编写装饰器,为函数加上认证的功能
def auth(func):
def wrapper():
with open('info','r',encoding='utf-8') as f:
username = input('小可爱,请输入您的用户名❤:')
password = input('小可爱,请输入您的密码❤:')
for line in f:
name,pwd = line.strip().split(':')
if username == name and password == pwd:
func()
break
else:
print('小可爱,您的账号或者密码可能有问题哦❤!')
return wrapper
# 定义被装饰对象
@auth
def log():
print ('小主人,欢迎光临!'.center(50,'❄'))
log()
四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
# 四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
# 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
# 定义全局变量,判断用户是否登录
log_name = None
# 如果用户登录就执行洗碗功能
def auth(func):
def wrapper(*args,**kwargs):
if log_name is None:
login()
else:
func()
return wrapper
# 登录功能
def login():
with open('db.txt','r',encoding='utf-8') as f:
user = input('请输入用户名:')
pwd = input('请输入密码:')
for line in f:
info = eval(line)
name = info['name']
password = info['password']
if user == name and pwd == password:
global log_name
log_name = user
print('登陆成功')
break
else:
print('登陆失败')
# 洗碗功能
@auth
def wash():
print('模范劳动人民,发小红花❀')
# 敷面膜
@auth
def facial():
print('精致的猪猪女孩😊😊')
dic_func = {
'0':('退出',exit),
'1':('登录',login),
'2':('洗碗',wash),
'3':('贴面膜',facial),
}
for choice in dic_func:
print(choice,dic_func[choice][0])
while True:
cmd = input('请选择功能:')
if not cmd.isdigit():
print('别闹,认真点')
if cmd in dic_func:
if cmd == '1':
if log_name is not None:
print('您已登录,不需要重复登录')
continue
else:dic_func[cmd][1]()
dic_func[cmd][1]()
else:
print('命令不存在')
五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
# 五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录
import time
# 定义全局变量,判断用户是否登录
log_name = None
log_time = 0
end_time = 0
# 如果登陆时间超过10s需要用户重新登录
def timer(func):
def wrapper(*args,**kwargs):
if end_time-log_time <20:
func()
else:
print('重新登陆')
login()
return wrapper
# 如果用户登录就执行功能
def auth(func):
def wrapper(*args,**kwargs):
if log_name is None:
login()
else:
global end_time
end_time = time.time()
print(f'此时时间是{end_time}')
func()
return wrapper
# 登录功能
def login():
with open('db.txt','r',encoding='utf-8') as f:
user = input('请输入用户名:')
pwd = input('请输入密码:')
for line in f:
info = eval(line)
name = info['name']
password = info['password']
if user == name and pwd == password:
global log_name,log_time
log_name = user
log_time = time.time()
print(f'登陆成功,登陆成功的时间为{log_time}')
break
else:
print('登陆失败')
# 洗碗功能
@timer
@auth
def wash():
print('模范劳动人民,发小红花❀')
# 敷面膜
@timer
@auth
def facial():
print('精致的猪猪女孩😊😊')
dic_func = {
'0':('退出',exit),
'1':('登录',login),
'2':('洗碗',wash),
'3':('贴面膜',facial),
}
for choice in dic_func:
print(choice,dic_func[choice][0])
while True:
cmd = input('请选择功能:')
if not cmd.isdigit():
print('别闹,认真点')
if cmd in dic_func:
if cmd == '1':
if log_name is not None:
print('您已登录,不需要重复登录')
continue
else:dic_func[cmd][1]()
dic_func[cmd][1]()
else:
print('命令不存在')
六:选做题
# 思考题(选做),叠加多个装饰器,加载顺序与运行顺序,可以将上述实现的装饰器叠加起来自己验证一下
# @deco1 # index=deco1(deco2.wrapper的内存地址)
# @deco2 # deco2.wrapper的内存地址=deco2(deco3.wrapper的内存地址)
# @deco3 # deco3.wrapper的内存地址=deco3(index)
# def index():
# pass
def outter1(func):
def wrapper(*args, **kwargs):
func()
print('outter1')
return wrapper
def outter2(func):
def wrapper(*args, **kwargs):
func()
print('outter2')
return wrapper
def outter3(func):
def wrapper(*args, **kwargs):
func()
print('outter3')
return wrapper
@outter3
@outter2
@outter1
def index():
print('index本体')
index()