20.03.23作业

import time
# 一:编写函数,(函数执行的时间用time.sleep(n)模拟)
# def index():
# time.sleep(3)
# print('执行完毕')
# index()
# 二:编写装饰器,为函数加上统计时间的功能
# def timer(func):
# def wrapper(*args,**kwargs):
# start_time = time.time()
# func(*args,**kwargs)
# stop_time = time.time()
# print('执行时间为:',stop_time - start_time)
# return wrapper
# @timer
# def index():
# time.sleep(3)
# print('执行完毕')
# index()
# 三:编写装饰器,为函数加上认证的功能
# def auth(func):
# def wrapper(*args,**kwargs):
# user = input('请输入用户名:').strip()
# pwd = input('请输入密码:').strip()
# if user == 'egon' and pwd == '123':
# func(*args,**kwargs)
# else:
# print('用户名或密码错误')
# return wrapper
# @auth
# def index():
# time.sleep(3)
# print('执行完毕')
# index()



# 四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
# 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式
# login_user=None
# def auth(func):
# def wrapper(*args,**kwargs):
# global login_user
# if login_user == None:
# print('请先登录'.center(30,'*'))
# user = input('请输入用户名:').strip()
# pwd = input('请输入密码:').strip()
# with open(r'user.txt','r',encoding='utf-8') as f:
# for line in f:
# # print(line)
# user_info = eval(line)
# if user == user_info['name'] and pwd == user_info['password']:
# print('认证成功'.center(30,'*'))
# login_user = user
# func(*args,**kwargs)
# else:
# print('认证失败'.center(30,'*'))
# else:
# func(*args,**kwargs)
# return wrapper
#
# @auth
# def recharge():
# print('这是充值功能'.center(30,'*'))
#
# @auth
# def transfer_accounts():
# print('这是转账功能'.center(30,'*'))
#
# @auth
# def reflect():
# print('这是提现功能'.center(30,'*'))
#
# @auth
# def check_the_balance():
# print('这是查询余额功能'.center(30,'*'))
#
# @auth
# def sign_out():
# print('这是退出功能'.center(30,'*'))
# login_dic = {
# '0': (sign_out,'退出'),
# '1': (recharge,'充值'),
# '2': (transfer_accounts,'转账'),
# '3': (reflect,'提现'),
# '4': (check_the_balance,'查询余额')
# }
# while True:
# for k in login_dic:
# print('{}---{}'.format(k,login_dic[k][1]))
# cmd = input('请输入指令:').strip()
# if not cmd.isdigit():
# print('请输入数字指令')
# if cmd not in login_dic:
# print('请输入正确的指令')
# else:
# login_dic.get(cmd)[0]()

# 五:编写装饰器,为多个函数加上认证功能,要求登录成功一次,在超时时间内无需重复登录,超过了超时时间,则必须重新登录

# login_user=None
# login = {'login_time': 0,'out_time':5}
# def auth(func):
# def wrapper(*args,**kwargs):
# global login_user
# start_time = time.time()
# if login_user == None:
# print('请先登录'.center(30,'*'))
# user = input('请输入用户名:').strip()
# pwd = input('请输入密码:').strip()
# with open(r'user.txt','r',encoding='utf-8') as f:
# for line in f:
# user_info = eval(line)
# if user == user_info['name'] and pwd == user_info['password']:
# print('认证成功'.center(30,'*'))
# login_user = user
# func(*args, **kwargs)
# #如果登录时间超过5s下次执行指令需重新登录
# login['login_time'] = time.time()
# if login['login_time'] - start_time > login['out_time']:
# login_user = None
# else:
# print('认证失败'.center(30,'*'))
# else:
# func(*args,**kwargs)
# return wrapper
#
# @auth
# def recharge():
# print('这是充值功能'.center(30,'*'))
#
# @auth
# def transfer_accounts():
# print('这是转账功能'.center(30,'*'))
#
# @auth
# def reflect():
# print('这是提现功能'.center(30,'*'))
#
# @auth
# def check_the_balance():
# print('这是查询余额功能'.center(30,'*'))
#
# @auth
# def sign_out():
# print('这是退出功能'.center(30,'*'))
# login_dic = {
# '0': (sign_out,'退出'),
# '1': (recharge,'充值'),
# '2': (transfer_accounts,'转账'),
# '3': (reflect,'提现'),
# '4': (check_the_balance,'查询余额')
# }
# while True:
# for k in login_dic:
# print('{}---{}'.format(k,login_dic[k][1]))
# cmd = input('请输入指令:').strip()
# if not cmd.isdigit():
# print('请输入数字指令')
# if cmd not in login_dic:
# print('请输入正确的指令')
# else:
# login_dic.get(cmd)[0]()

# 六:选做题
# 思考题(选做),叠加多个装饰器,加载顺序与运行顺序,可以将上述实现的装饰器叠加起来自己验证一下
# @deco1 # index=deco1(deco2.wrapper的内存地址)
# @deco2 # deco2.wrapper的内存地址=deco2(deco3.wrapper的内存地址)
# @deco3 # deco3.wrapper的内存地址=deco3(index)
# def index():
# pass


def outter1(func):
print("outter1")
def inner(*args, **kwargs):
print("====outter1 start====")
func(*args, **kwargs)
print("====outter1 end====")
return inner


def outter2(func):
print("outter2")
def inner(*args, **kwargs):
print("====outter2 start====")
func(*args, **kwargs)
print("====outter2 end====")
return inner

@outter1
@outter2
def f():
print("****执行完毕****")

f()


'''运行结果:
outter2
outter1
====outter1 start====
====outter2 start====
****执行完毕****
====outter2 end====
====outter1 end====

'''
# 装饰器函数执行的先后顺序是离原函数越近越先执行,它会一层一层的运行,外层运行完毕后再运行内层,内层outter2执行完毕后,outter1又在outter2基础上再运行
原文地址:https://www.cnblogs.com/zhangjinyi97/p/12554677.html