Python面向对象(7)面向对象版学员管理系统
学习目标
- 了解面向对象开发过程中类内部功能的分析方法
- 了解常用的系统功能:增删改查
系统需求
使用面向对象编程思想完成学员管理系统的开发,具体如下:
- 系统要求:学员数据要存储在一个文件中
- 系统功能:添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退出系统等功能。
准备程序文件
角色分析:1.学员;2.管理系统
工作中注意:1. 为了方便维护代码,一般一个角色一个程序文件;2. 项目要有主程序入口,习惯为main.py
创建程序文件:
首先创建项目目录:例如:StudentManagerSystem
程序文件:
- 程序入口文件:main.py
- 学员类文件:student.py
- 管理系统文件:managersystem.py
代码框架实现
student.py
之所以先写student.py这个文件,是因为先有学员数据信息,所以对数据信息进行处理后才能进行系统的处理,它的需求如下:
- 学员信息包含:姓名、性别、手机号;
- 添加
__str__
魔法方法,方便查看学员对象信息。
程序代码:
1
2
3
4
5
6
7
|
class Student(object):
def __init__(self, name, gender, tel):
self.name = name
self.gender = gender
self.tel = tel
def __str__(self):
return f'{self.name},{self.gender},{self.tel}'
|
managersystem.py
这个文件是管理系统的代码,它的需求如下:
- 存储数据的位置,是在文件中,文件名为
student.data
,数据可以被加载,可以被修改和保存。
- 存储数据的形式:列表存储学员对象。
- 系统功能:
- 添加学员
- 删除学员
- 修改学员
- 查询学员信息
- 显示所有学员信息
- 保存学员信息
定义类:
1
2
3
|
class managerSystem():
def __init__(self):
self.student_list = [] # 存储数据用的列表
|
管理系统的框架:
需求:系统功能循环使用,用户输入不同的功能序号可以执行不同的功能。
- 步骤:
- 定义程序入口函数:
- 加载数据
- 显示功能菜单
- 用户输入功能序号
- 根据用户输入的功能序号执行不同的功能
- 定义系统功能函数,添加、删除学员等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
class ManagerSystem():
def __init__(self):
self.student_list = [] # 存储数据用的列表
# 入口函数开始 一般定义为run函数
def run(self):
self.load_student() # 加载数据调用实例方法
while True: # 显示功能菜单
self.show_menu()
menu_num = input("请输入您需要的功能序号:")
if menu_num == '1':
self.add_student()
elif menu_num == '2':
self.del_student()
elif menu_num == '3':
self.update_student()
elif menu_num == "4":
self.search_student()
elif menu_num == '5':
self.show_all_student()
elif menu_num == '6':
self.save_student()
else:
break
@staticmethod
def show_menu(): # 展示界面方法不涉及参数绑定,因此静态,不涉及对象数据的使用
print('请选择如下功能:')
print('1.添加学员')
print('2.删除学员')
print('3.修改学员')
print('4.查询学员')
print('5.显示所有学员')
print('6.保存学员信息')
print('7.退出')
def add_student(self):
pass
def del_student(self):
pass
def update_student(self):
pass
def search_student(self):
pass
def show_all_student(self):
pass
def save_student(self):
pass
def load_student(self):
pass
|
main.py
main.py文件是程序的入口文件,也就是说,运行这个文件,即能启动整个系统,即可以调用系统的方法。
1
2
3
4
5
|
from managersystem import *
# 只有运行main文件才能执行其中的语句
if __name__ == '__main__':
student_manager = ManagerSystem()
student_manager.run()
|
在系统框架内定义系统功能函数
添加功能
- 需求:用户输入姓名,性别,手机号,将学员添加到系统。
- 步骤:
- 用户输入姓名,性别,手机号;
- 创建该学员对象;
- 将该学员对象添加到列表。
- 代码:
1
2
3
4
5
6
7
|
def add_student(self):
name = input("请输入您的姓名:")
gender = input("请输入您的性别:")
tel = input("请输入您的手机:")
new_student = student(name,gender,tel)
self.student_list.append(new_student) # 新学生信息对象加入到列表
print(self.student_list)
|
删除功能
- 需求:用户输入目标学员的姓名,如果学员存在则删除该学员。
- 步骤:
- 用户输入目标学员姓名
- 遍历学员数据列表,如果用户输入的学员姓名存在则删除,否则提示该学员不存在。
- 代码
1
2
3
4
5
6
7
8
9
|
def del_student(self):
del_name = input("请输入删除的学员姓名:")
for i in self.student_list:
if del_name == i.name:
self.student_list.remove(i)
break
else:
print('查无此人')
print(self.student_list)
|
修改学员功能
- 需求:用户输入目标学员姓名,如果学员存在则修改该学员信息。
- 步骤:
- 用户输入目标学员姓名
- 遍历学员数据列表,如果用户输入的学员姓名存在,则修改学员的姓名、性别、手机号数据,否则提示该学员不存在。
- 代码:
1
2
3
4
5
6
7
8
9
10
11
|
def update_student(self):
name = input("请输入需要修改的学员姓名:")
for i in self.student_list:
if name == i.name:
i.name = input("修改姓名为:")
i.gender = input("修改性别为:")
i.tel = input("修改手机号为:")
print(f'修改完成,姓名为:{i.name},性别为:{i.gender},手机为:{i.tel}')
break
else:
print("查无此人")
|
查询学员
- 需求:用户输入查询的目标学员姓名,如果学员存在,则显示该学员信息。
- 步骤:
- 用户输入目标学员姓名
- 遍历学员数据列表,输入学员姓名存在则打印,否则提示不存在。
- 代码:
1
2
3
4
5
6
7
8
|
def search_student(self):
name = input("请输入需要查询的学员姓名:")
for i in self.student_list:
if name == i.name:
print(f'该用户姓名为:{i.name},性别为:{i.gender},手机为:{i.tel}')
break
else:
print('查无此人')
|
显示所有信息
1
2
3
4
|
def show_all_student(self):
print('姓名\t性别\t手机')
for i in self.student_list:
print(f'{i.name}\t{i.gender}\t{i.tel}')
|
保存学员信息
- 需求:将修改后的学员数据保存到存储数据的文件中。
- 步骤:
文件内数据要求的数据类型是字符串,写入的数据不是学员对象的地址,而是写入每个学员的字典值。
__dict__
是类对象或者实例对象都拥有的属性,收集类对象和实例对象的属性和方法以及对应的值,返回一个字典。
1
2
3
4
5
6
7
8
9
|
class A(object):
a = 0
def __init__(self):
self.b = 1
aa = A()
print(A.__dict__)
# {'__module__': '__main__', 'a': 0, '__init__': <function A.__init__ at 0x7f9078f111f0>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
print(aa.__dict__)
# {'b': 1}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def save_student(self):
try:
f = open('student.data','w')
except:
print('读写异常退出')
return
else:
# 写入数据不能为对象,需要把学员数据转化成列表内嵌套字典数据存储。
new_list = [i.__dict__ for i in self.student_list]
# 数据变为[{'name':'aa','gender':'male','tel':'123123123'}]
print(new_list)
f.write(str(new_list))
finally:
f.close()
|
加载学员信息
- 需求:每次进入系统后,修改的数据是文件里面的数据
- 步骤:
- 尝试以r模式来打开学员数据文件,如果文件不存在则以w模式来打开文件
- 如果文件存在则读取数据并存储数据
- 读取数据
- 转换数据类型为列表并转换为列表内的字典为对象
- 存储学员数据到学员列表
- 关闭文件
- 代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
def load_student(self):
try:
f = open('student.data','r')
except:
f = open('student.data','w')
else:
data = f.read()
new_list = eval(data)
# 字典转化为对象保存入list缓冲区
self.student_list = [Student(i['name'],i['gender'],i['tel']) for i in new_list]
finally:
f.close()
|
总结
- 对每一个功能用到函数进行封装,确定对象来调用函数。
- 项目中使用面向对象的思想:主要确定了两个角色,系统和学员,并定义为类,其中学员主要用来保存属性,系统用来进行对学员属性数据进行处理。未使用到继承。
- 数据类型:列表(及列表推导式)、字典、字符串。
- 文件操作:IO操作写入到异常中,读取和写入的数据类型是字符串类型。