基于Python实现面向对象版学生管理系统
本文基于Python面向对象编程思想,手把手教您从零构建一个控制台版学生管理系统。内容涵盖项目文件架构设计、学生类模型封装、增删改查等核心业务逻辑的实现,以及借助 __dict__ 魔法方法和文件 IO 完成数据的持久化存储,全面巩固类的属性方法调用与列表字典操作技巧。
一、项目目标与核心需求
本案例旨在通过实际项目演练,深入理解面向对象开发过程中的类内部功能分析方法。系统将围绕以下核心模块展开:
- 添加:录入新学生基本信息。
- 删除:根据姓名移除指定学生记录。
- 修改:更新已有学生的详细信息。
- 查询:检索特定学生并打印其详情。
二、准备程序文件与目录结构
遵循软件工程中的高内聚低耦合原则,我们先将系统进行角色拆解。本案例涉及两个主要角色:Student(负责维护单个学生的属性)和 ManagerSystem(负责统筹管理所有学生数据及交互逻辑)。为方便后期维护,建议一个角色对应一个独立的 Python 文件,并在项目根目录设置统一的程序入口 main.py。
三、编写核心功能代码
第1步:定义学生数据模型
目的:建立独立的数据载体,明确学生对象应包含的属性及其打印时的默认展示格式。
操作:新建 student.py,定义 Student 类。
学生信息需包含姓名、性别和手机号。同时重载 __str__ 魔术方法,便于后续调试和打印对象时直观查看数据状态。
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}'
第2步:搭建管理系统框架
目的:构建系统的中枢调度器,实现主循环控制流、功能菜单展示以及初始数据的加载。
操作:新建 managerSystem.py,导入 Student 类并定义 StudentManager 类。
系统需要将数据存储在文件中,并以列表形式在内存中维护所有学生对象实例。以下是基础的框架结构与主入口函数逻辑:
from student import *
class StudentManager(object):
def __init__(self):
# 内存中用于暂存学生对象的列表
self.student_list = []
def run(self):
# 启动系统后首先尝试恢复历史数据
self.load_student()
while True:
self.show_menu()
menu_num = int(input('请输入您需要的功能序号:'))
if menu_num == 1:
self.add_student()
elif menu_num == 2:
self.del_student()
elif menu_num == 3:
self.modify_student()
elif menu_num == 4:
self.search_student()
elif menu_num == 5:
self.show_student()
elif menu_num == 6:
self.save_student()
elif menu_num == 7:
print('感谢您的使用,祝您生活愉快!')
break
@staticmethod
def show_menu():
print('\n请选择如下功能:')
print('1. 添加学生')
print('2. 删除学生')
print('3. 修改学生信息')
print('4. 查询学生信息')
print('5. 显示所有学生信息')
print('6. 保存学生信息')
print('7. 退出系统')
第3步:实现学生信息的增、删、改、查
目的:完善系统的具体业务逻辑,完成对数据的增删改查 CRUD 操作。
操作:在 StudentManager 类中依次补充四个成员方法。
添加学生 (add_student):收集终端输入,实例化 Student 对象并追加至内存列表。
def add_student(self):
name = input('请输入学生的姓名:')
gender = input('请输入学生的性别:')
tel = input('请输入学生的手机号:')
student = Student(name, gender, tel)
self.student_list.append(student)
print(f'学生【{student.name}, {student.gender}, {student.tel}】添加成功!')
删除学生 (del_student):遍历列表比对姓名,找到匹配对象后使用 remove() 剔除。
def del_student(self):
del_name = input('请输入要删除的学生姓名:')
for i in self.student_list:
if i.name == del_name:
self.student_list.remove(i)
break
else:
print('查无此人!')
修改学生信息 (modify_student):定位目标对象后,动态覆盖其属性值。
def modify_student(self):
modify_name = input('请输入要修改的学生姓名:')
for i in self.student_list:
if i.name == modify_name:
i.name = input('请输入学生姓名:')
i.gender = input('请输入学生性别:')
i.tel = input('请输入学生手机号:')
print(f'修改该学生信息成功,姓名: {i.name}, 性别: {i.gender}, 手机号: {i.tel}')
break
else:
print('查无此人!')
查询学生信息 (search_student):条件匹配成功后直接返回该对象的属性组合。
def search_student(self):
search_name = input('请输入要查询的学生姓名:')
for i in self.student_list:
if i.name == search_name:
print(f'姓名: {i.name}, 性别: {i.gender}, 手机号: {i.tel}')
break
else:
print('查无此人!')
显示所有学生信息 (show_student):遍历列表并按制表符分隔输出表头与各行数据。
def show_student(self):
print('姓名\t性别\t手机号')
for i in self.student_list:
print(f'{i.name}\t{i.gender}\t{i.tel}')
第4步:实现数据的持久化存储与加载
目的:解决程序重启后内存数据丢失的问题,将对象状态落盘至本地文件,并在下次启动时恢复。
操作:实现 save_student() 与 load_student() 方法。
在写入文件前,必须思考一个核心问题:能否直接将 Python 对象实例地址存入文本?答案是否定的。文件只能存储字符串类型的纯文本数据。此时可利用对象的 __dict__ 特性,快速获取当前实例的所有属性键值对组成的字典。

def save_student(self):
# 1. 打开文件准备写入
f = open('student.data', 'w', encoding='utf-8')
# 2. 利用列表推导式将对象集合转换为字典集合
new_list = [i.__dict__ for i in self.student_list]
print(new_list) # 调试输出:[{ 'name': 'xx', 'gender': '男', 'tel': '123' }]
# 3. 强制转换为字符串格式并写入磁盘
f.write(str(new_list))
# 4. 务必关闭资源释放文件占用
f.close()
def load_student(self):
# 尝试以读取模式打开文件,若不存在则先创建空文件占位
try:
f = open('student.data', 'r', encoding='utf-8')
except Exception as e:
f = open('student.data', 'w', encoding='utf-8')
else:
data = f.read()
# 利用 eval 还原文本格式的列表字典结构
new_list = eval(data)
# 遍历字典重新拼装 Student 实例对象并回填内存列表
self.student_list = [Student(i['name'], i['gender'], i['tel']) for i in new_list]
finally:
f.close()
四、完整源代码参考
以下为三个模块的最终合并代码,可直接复制并在终端运行测试。
main.py(入口文件)
from managerSystem import *
if __name__ == '__main__':
student_manager = StudentManager()
student_manager.run()
student.py(数据模型)
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(业务逻辑)
from student import *
class StudentManager(object):
def __init__(self):
self.student_list = []
def run(self):
self.load_student()
while True:
self.show_menu()
menu_num = int(input('请输入您需要的功能序号:'))
if menu_num == 1: self.add_student()
elif menu_num == 2: self.del_student()
elif menu_num == 3: self.modify_student()
elif menu_num == 4: self.search_student()
elif menu_num == 5: self.show_student()
elif menu_num == 6: self.save_student()
elif menu_num == 7:
print('感谢您的使用,祝您生活愉快!')
break
@staticmethod
def show_menu():
print('\n请选择如下功能:')
print('1. 添加学生 | 2. 删除学生 | 3. 修改信息')
print('4. 查询学生 | 5. 显示全部 | 6. 保存信息')
print('7. 退出系统')
def add_student(self):
name, gender, tel = input('姓名:'), input('性别:'), input('手机:')
self.student_list.append(Student(name, gender, tel))
print('添加成功!')
def del_student(self):
target = input('输入待删除姓名:')
for obj in self.student_list:
if obj.name == target:
self.student_list.remove(obj)
break
else: print('未找到该记录。')
def modify_student(self):
target = input('输入待修改姓名:')
for obj in self.student_list:
if obj.name == target:
obj.name, obj.gender, obj.tel = input('新姓名:'), input('新性别:'), input('新手机:')
print('修改完毕。'); break
else: print('未找到该记录。')
def search_student(self):
target = input('输入待查姓名:')
for obj in self.student_list:
if obj.name == target:
print(f'详情 -> 姓名:{obj.name} 性别:{obj.gender} 电话:{obj.tel}'); break
else: print('未找到该记录。')
def show_student(self):
print('姓名\t性别\t手机号')
for obj in self.student_list:
print(f'{obj.name}\t{obj.gender}\t{obj.tel}')
def save_student(self):
f = open('student.data', 'w', encoding='utf-8')
f.write(str([o.__dict__ for o in self.student_list]))
f.close()
def load_student(self):
try: f = open('student.data', 'r', encoding='utf-8')
except: f = open('student.data', 'w', encoding='utf-8')
else:
data = f.read()
self.student_list = [Student(d['name'], d['gender'], d['tel']) for d in eval(data)]
finally: f.close()
五、关键知识点总结
本系统综合运用了 Python 开发的基础核心概念,完成了一个轻量级数据管理应用。掌握以下要点有助于快速上手后续更复杂的项目:
- 函数机制:熟练定义模块级函数与类实例方法,理解
self指针在实例属性绑定中的作用。 - 面向对象编程:通过
__init__构造对象状态,利用__dict__动态映射属性,体会封装思想。 - 数据结构操作:使用列表
append/remove维护数据集,结合列表推导式高效完成类型转换。 - 文件 I/O 标准流:严格遵循打开 -> 读写 -> 关闭流程,配合
try...finally避免资源泄露导致内存异常。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









