# 1、整理装饰器的形成过程,背诵装饰器的固定格式
def wrapper(f):
def inner(*args, **kwargs):
ret = f(*args, **kwargs)
return ret
return inner
# 2、 编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’
def wrapper(f):
def inner(*args, **kwargs):
print('每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码')
ret = f(*args, **kwargs)
return ret
return inner
# 3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码’
def wrapper(f):
def inner(*args, **kwargs):
ret = f(*args, **kwargs)
print('每次执行被装饰函数之后都得先经过这里,这里根据需求添加代码')
return ret
return inner
# 4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.
# 定义登录状态
login_status = {
'username': None,
'password':None,
'status': False,
}
# 定义装饰器
def login(f):
def inner(*args, **kwargs):
if login_status['status']:
ret = f(*args, **kwargs)
return ret
else:
count = 0
while count < 3:
name = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
if name == 'mayugang' and password == '123456':
print('恭喜你,登录成功!')
login_status['username'] = name
login_status['password'] = password
login_status['status'] = True
ret = f(*args, **kwargs)
return ret
elif name != 'mayugang' or password != '123456':
print('输入的账号或者密码有误,请重新输入!')
count = count + 1
n = str(3 - count)
print('您有' + n + '次重试机会')
if n == '0':
print('抱歉,您已经没有登录机会!')
return inner
@login # func = login(func)
def func():
print('欢迎访问系统页面')
func()
# 5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码
# 定义登录状态
login_status = {
'username': None,
'password':None,
'status': False,
}
# 定义装饰器
def login(f):
def inner(*args, **kwargs):
if login_status['status']:
ret = f(*args, **kwargs)
return ret
else:
count = 0
while count < 3:
name = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
# 通过读文件的方式获取用户名和密码。
f1 = open('账号管理', encoding='utf-8', mode='r')
content = f1.read().strip().split('|')
if name == content[0].strip() and password == content[1].strip():
print('恭喜你,登录成功!')
login_status['username'] = content[0].strip()
login_status['password'] = content[1].strip()
login_status['status'] = True
ret = f(*args, **kwargs)
return ret
elif name != content[0].strip() or password != content[1].strip():
print('输入的账号或者密码有误,请重新输入!')
count = count + 1
n = str(3 - count)
print('您有' + n + '次重试机会')
if n == '0':
print('抱歉,您已经没有登录机会!')
quit()
f1.close()
return inner
@login # func = login(func)
def func():
print('欢迎访问系统页面')
func()
@login
def func1():
print('欢迎访问系统页面1')
func1()
@login
def func2():
print('欢迎访问系统页面2')
func2()
# 6,编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),要求登录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。
login_status = {
'username': None,
'password':None,
'status': False,
}
# 定义装饰器
def login(f):
def inner(*args, **kwargs):
if login_status['status']:
ret = f(*args, **kwargs)
return ret
else:
count = 0
while count < 3:
name = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
# 通过读文件的方式获取用户名和密码,支持多个账号和密码。
f1 = open('多账号管理', encoding='utf-8', mode='r')
for i in f1:
content = i.strip().split('|')
if name == content[0].strip() and password == content[1].strip():
print('恭喜你,登录成功!')
login_status['username'] = content[0].strip()
login_status['password'] = content[1].strip()
login_status['status'] = True
ret = f(*args, **kwargs)
return ret
elif name != content[0].strip() or password != content[1].strip():
print('输入的账号或者密码有误,请重新输入!')
count = count + 1
n = str(3 - count)
print('您有' + n + '次重试机会')
break
if count >= 3:
print('抱歉,您已经没有登录机会!')
quit()
f1.close()
return inner
@login # func = login(func)
def func():
print('欢迎访问系统页面0')
func()
@login
def func1():
print('欢迎访问系统页面1')
func1()
@login
def func2():
print('欢迎访问系统页面2')
func2()
'''
7,给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
'''
## 导入时间模块
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
# 定义一个记录日志的装饰器
def log(f):
def inner(*args, **kwargs):
t = f.__name__ # 注意,是两个下划线组成了一个下划线
f1 = open('日志文件log',encoding='utf-8',mode='a')
f1.write(time.strftime("%Y-%m-%d %H:%M:%S", struct_time))
f1.write(' '+t +'\n')
f(*args, **kwargs)
f1.close()
return inner
@log
def func1():
pass
func1()
@log
def func2():
pass
func2()
@log
def func3():
pass
func3()