面向对象案例:学生管理系统
软件开发的大致流程
-
产品经理:将用户的需求,写成产品规格说明文档
-
程序员:需求分析–>架构设计(概要设计/详细设计)–>编码–>单元(类/函数)测试
-
测试员:自动化测试
-
上线/维护
面向对象案例:学生管理系统
-
目的:通过案例熟悉面向对象的设计思想,掌握Python面向对象编程的语法
-
需求:实现对学生信息的增加、删除、修改和查询。
架构设计:
- 界面选择使用控制台(也可以使用Web等等)。
-
识别对象(MVC三大类):界面视图类(V) 逻辑控制类© 数据模型类(M)
-
Model:描述需要处理的数据的模型(类)
-
View:负责处理界面逻辑
-
Controller:负责处理业务逻辑
-
-
分配职责:
-
界面视图类:负责处理界面逻辑,比如显示菜单,获取输入,显示结果等。
-
逻辑控制类:负责存储学生信息,处理业务逻辑。比如添加、删除等
-
数据模型类:定义需要处理的数据类型。比如学生信息。
-
-
建立交互:界面视图对象 <----> 数据模型对象 <----> 逻辑控制对象设计
-
C和M的交互:M生成的对象作为参数传递给C类方法体中进行相关的业务处理。同时C类对象调用一个方法时会调用
-
C和V的交互:界面类需要使用逻辑控制类对象的数据和方法:需要多次操作同一个实例化对象,所以在界面类的构造函数中创建逻辑控制类对象
-
编码
根据分析结果,封装成以下三个类,每个类的具体数据和行为如下
- 界面视图类:StudentManagerView
-
数据:逻辑控制对象__manager
-
行为:
-
显示菜单__display_menu:在控制台打印选项
-
选择菜单项__select_menu_item:输入一个数字,通过条件语句调用对应的方法
-
输入学生__input_students:
-
输出学生__output_students:
-
删除学生__delete_student,
-
修改学生信息__modify_student,
-
按成绩输出学生__output_student_by_score
-
-
入口逻辑main:循环调用__display_menu和__select_menu_item
-
-
数据模型类:StudentModel
- 数据:编号 id,姓名 name,年龄 age,成绩 score
- 使用@property属性将以上数据设置成只读,
-
逻辑控制类:StudentManagerController
-
数据:学生列表 __stu_list(列表元素是StudentModel类对象)
-
行为:
-
获取列表 stu_list:只允许获取列表,不允许修改,使用标准属性property进行封装
-
添加学生 add_student:先成一个StudentModel对象,修改id(可定义一个id生成器方法),然后添加到__stu_list列表中
-
删除学生remove_student:接收一个id,根据id在列表 stu_list找到对象,删除掉
-
修改学生update_student:接收一个id,根据id在列表 stu_list找到对象,修改对象变量
-
根据成绩排序order_by_score:使用列表切片方法,生成一个新的列表,然后将列表中元素两两比较(标记元素的score属性),进行排序。
-
完整代码
"""
学生管理器系统
"""
class StudentModel:
"""
学生数据模型
"""
def __init__(self, name="", age=0, score=0, id=0):
self.name = name
self.age = age
self.score = score
self.id = id
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
self.__name = value
@property
def age(self):
return self.__age
@age.setter
def age(self, value):
self.__age = value
@property
def score(self):
return self.__score
@score.setter
def score(self, value):
self.__score = value
@property
def id(self):
return self.__id
@id.setter
def id(self, value):
self.__id = value
class StudentManagerController:
"""
逻辑控制类
"""
def __init__(self):
# 数据结果:[StudentModel(...),StudentModel(...)]
self.__stu_list = []
@property
def stu_list(self):
return self.__stu_list
def add_student(self, new_stu):
"""
添加学生
:param new_stu: 没有id的新学生
"""
new_stu.id = self.__generate_id()
self.__stu_list.append(new_stu)
def __generate_id(self):
# 最后一个学生编号+1
return self.__stu_list[-1].id + 1 if len(self.__stu_list) > 0 else 1
def remove_student(self, remove_id):
# 根据id删除学生
for item in self.__stu_list:
if item.id == remove_id:
self.__stu_list.remove(item)
return True
return False
def update_student(self, stu_info, id):
# 根据id修改学生
for item in self.__stu_list:
if item.id == id:
item.id = id
item.name = stu_info.name
item.score = stu_info.score
item.age = stu_info.age
return True
return False
def order_by_score(self):
"""
根据成绩升序排列:
两两比较,大于则交互位置,
:return:
"""
# 创建一个新的列表,进行操作,避免影响添加时id混乱
sort_list = self.stu_list[:]
for r in range(len(sort_list) - 1):
for c in range(1, len(sort_list) - r):
if sort_list[r].score > sort_list[r + c].score:
sort_list[r], sort_list[r + c] = sort_list[r + c], sort_list[r]
return sort_list
class StudentManagerView:
def __init__(self):
self.__manager = StudentManagerController()
@property
def manager(self):
return self.__manager
def __display_menu(self):
"""
显示菜单
:return:
"""
print("1)添加学生")
print("2)显示学生")
print("3)删除学生")
print("4)修改学生")
print("5)按成绩升序显示")
def __select_menu_item(self):
"""
选择菜单
:return:
"""
number = input("请选择序号:")
if number == "1":
# 添加学生
self.__input_student()
elif number == "2":
# 输出学生
self.__out_student(self.manager.stu_list)
elif number == "3":
# 删除学生
self.__delete_student()
elif number == "4":
# 修改学生
self.__modify_student()
elif number == "5":
# 按成绩升序显示
self.__out_student(self.__output_student_by_score())
elif number == " ":
# 退出循环
return True
def main(self):
while True:
self.__display_menu()
if self.__select_menu_item():
break
def __input_student(self):
"""
输入学生
:return:
"""
name = input("请输入姓名:")
age = input("请输入年龄:")
score = input("请输入成绩:")
stu = StudentModel(name, int(age), int(score))
self.manager.add_student(stu)
def __out_student(self, list_stu):
for item in list_stu:
print("姓名:%s 年龄:%s 分数:%s 编号:%s" % (item.name, item.age, item.score, item.id))
def __delete_student(self):
id = int(input("请输入删除的学生id:"))
self.manager.remove_student(id)
def __modify_student(self):
id = int(input("请输入修改的学生id:"))
name = input("请输入姓名:")
age = input("请输入年龄:")
score = input("请输入成绩:")
stu = StudentModel(name, int(age), int(score))
self.manager.update_student(stu, id)
def __output_student_by_score(self):
return self.manager.order_by_score()
# 实例界面视图类,调用main方法
view = StudentManagerView()
view.main()