在本节中我么将使用面向对象的方法与 MVC 设计模式重构一下我们之前写的用户登录系统,同样实现用户的登录,注册,查询等功能。
首先需要知道面向对象的本质就是找到问题中有哪些相关者,然后找到他们之间的关系。那么根据我们 MVC 设计模式,我们的系统应该包含下面三个类,我们一一来实现它们。
因为 Service 层,View 层都需要使用 Database 层,所以我们首先写一个数据库的类,为了便于维护我们可以使用单例来写。
更多关于单例见:https://www.jianshu.com/p/0af7ffaf7c3e
数据库的主要功能就是增删改查用户的信息。
class DB:
instance = None
def __new__(cls, *args, **kwargs):
if DB.instance is None:
DB.instance = super().__new__(cls)
return DB.instance
测试一下:
db = DB()
db1 = DB()
print(db)
print(db1)
<__main__.DB object at 0x000001B2482E3908>
<__main__.DB object at 0x000001B2482E3908>
可以看到是指向了同一个地址,继续完善我们的DataBace层,需要添加一些数据查询,添加的操作,因为我们需要对传入数据库的数据类型进行一个严格的规定,所以我们首先需要写一个一个User类。
class User:
def __init__(self, username, pwd):
self.username = username
self.pwd = pwd
def __str__(self):
return "'username':{0}, 'pwd':{1}".format(self.username, self.pwd)
下面为数据库添加查询与储存的功能。
class DB:
instance = None
def __new__(cls, *args, **kwargs):
if DB.instance is None:
DB.instance = super().__new__(cls)
return DB.instance
def __init__(self):
self._pool = []
def save_user(self, user):
'''
储存数据
:return:
'''
self._pool.append(user)
def get_uer_by_username(self, username):
'''
查找数据
:param username:
:return:
'''
for user in self._pool:
if username == user.username:
return user
为了体现单例实现的强大我们再来测试一下:
db = DB()
db1 = DB()
user1 = User('zhangsan', 123)
db.save_user(user1)
user2 = User('wsn', 123)
db.save_user(user2)
for user in db._pool:
print(user)
'username':zhangsan, 'pwd':123
'username':wsn, 'pwd':123
从输出结果中可以看出:虽然生成了两个对象但是都是在一个数据库上进行修改。
接下来我们来写 View 层,主要用于与用户交互,控制用户输入和输出。下面的 View 类实现了一个读取用户信息的方法和一个展示信息的方法。
class View:
def show_info(self, info):
opt = input(info)
return opt
def read_user_info(self):
'''
读取用户信息
:return:
'''
username = input("请输入用户名(长度0~10):\n")
pwd = input('请输入密码(长度0~10):\n')
if len(username)<0 or len(username)>10:
print('用户名不合法\n')
return None
if len(pwd) < 0 or len(pwd) > 10:
print('密码不合法\n')
return None
return User(username, pwd)
接下来我们再写 Service 层,用于实现用户注册,用户登录等方法。在写这个类的时候就需要我们添加新的数据库类方法,其实在面向对象编程中就是这样,不断的完善各个类的方法。
class DB:
instance = None
def __new__(cls, *args, **kwargs):
if DB.instance is None:
DB.instance = super().__new__(cls)
return DB.instance
def __init__(self):
self._pool = []
def save_user(self, user):
'''
储存数据
:return:
'''
self._pool.append(user)
def get_uer_by_username(self, username):
'''
查找数据
:param username:
:return:
'''
for user in self._pool:
if username == user.username:
return user
def get_all(self):
temp = self._pool[:]
return temp
class Service:
def __init__(self):
self.db = DB()
def register(self, user):
'''
用户注册
:param user:
:return:
'''
exist_user = self.db.get_uer_by_username(user.username)
if exist_user is not None:
return print('该用户已经存在\n')
self.db.save_user(user)
print('用户注册成功\n')
def login(self, user):
'''
用户登录
:param user:
:return:
'''
exist_user = self.db.get_uer_by_username(user.username)
if exist_user == None:
print('用户名或密码错误\n')
return None
if exist_user.pwd != user.pwd:
print('登录失败\n')
return None
print('登录成功')
return exist_user
def get_name_list(self):
name_list = []
users = self.db.get_all()
for user in users:
name_list.append(user.username)
return name_list
def show_user_list(self, users):
'''
展示用户信息
:param users:
:return:
'''
for user in users:
print(user)
最后一个类是为了使我们的程序可以跑起来,
class App():
def __init__(self):
self.v = View()
self.s = Service()
self.cur_user = None
def run(self):
while True:
view_opt = self.v.show_info("请选择要进行的操作: \n (1)注册\n (2)登录\n (3)退出")
if view_opt == '1':
user = self.v.read_user_info()
if user is not None:
self.s.register(user)
continue
if view_opt == '2':
user = self.v.read_user_info()
login_user = self.s.login(user)
if login_user is not None:
self.cur_user = login_user
self.show_home()
continue
break
def show_home(self):
while True:
user_opt = self.v.show_info("请选择要进行的操作: \n (1)查看用户信息\n (2)查看用户列表\n (3)退出")
if user_opt == '1':
print(self.cur_user)
if user_opt == '2':
users = self.s.get_name_list()
self.s.show_user_list(users)
if user_opt == '3':
break
最后运行程序
if __name__ == '__main__':
app = App()
app.run()
over