此代码借鉴自Python—装饰器模拟用户登陆验证功能
自己写一遍加深记忆,方便查找
Python装饰器模拟用户登陆验证功能
user_list = [
{'name': 'sb1', 'password': '123'},
{'name': 'sb2', 'password': '123'},
{'name': 'sb3', 'password': '123'},
{'name': 'sb4', 'password': '123'}
]
client_user = {'name': None, 'login': False}
def auth_func(func):
def wrapper(*args, **kwargs):
# 参数检查,判断是否有用户登录,如果有,不用验证,直接执行函数的功能
if client_user.get('name') and client_user.get('login'):
return func(*args, **kwargs)
# 输入用户名和密码
username = input('用户名:').strip()
password = input('密码:').strip()
user = {'name': username, 'password': password}
# 校验用户名和密码是否正确
if user in user_list:
client_user['name'], client_user['login'] = user.get('name'), True
return func(*args, **kwargs)
else:
print('用户名或密码错误')
return wrapper
@auth_func
def index():
print('欢迎来到主页')
@auth_func
def home(name):
print(f"{name},欢迎您")
if __name__ == '__main__':
print('登陆信息', client_user)
index()
print('登陆信息', client_user)
home('root')
装饰器的单例模式
参考python使用装饰器实现单例模式
描述:在第一个装饰器的基础上将其改为单例模式,自己给面试官说自己会的是装饰器的单例模式
user_list = [
{'name': 'sb1', 'password': '123'},
{'name': 'sb2', 'password': '123'},
{'name': 'sb3', 'password': '123'},
{'name': 'sb4', 'password': '123'}
]
client_user = {'name': None, 'login': False}
def singleton(cls, *args, **kwargs):
_instances = dict()
def get_instance(*args, **kwargs):
if cls not in _instances:
_instances[cls] = cls(*args, **kwargs)
return _instances[cls]
return get_instance
def auth_func(func):
def wrapper(*args, **kwargs):
# 参数检查,判断是否有用户登录,如果有,不用验证,直接执行函数的功能
if client_user.get('name') and client_user.get('login'):
return func(*args, **kwargs)
# 输入用户名和密码
username = input('用户名:').strip()
password = input('密码:').strip()
user = {'name': username, 'password': password}
# 校验用户名和密码是否正确
if user in user_list:
client_user['name'], client_user['login'] = user.get('name'), True
return func(*args, **kwargs)
else:
print('用户名或密码错误')
return wrapper
@auth_func
def index():
print('欢迎来到主页')
@singleton
@auth_func
def home(name):
print(f"{name},欢迎您")
if __name__ == '__main__':
print('登陆信息', client_user)
index()
print('登陆信息', client_user)
home('root')
home('admin')
单例模式的结果: