目录
一、项目需求
二、分析
学生类:
管理系统类:
数据文件:
三、优化
四、项目方法构造
学生类:
管理系统类:
1、载入数据
2、导出数据
3、打印目录
4、增加学生信息
5、删除某个学生信息
6、修改某个学生信息
7、查询全部学生
8、查询单个学生
9、开始运行函数
五、运行截图
添加学生:
修改学生:
删除学生:
六、案例代码
七、总结
一、项目需求
基本需求:完成系统的增、删、改、查功能
增加需求:1.使用面向对象的思想开发;2.把学生信息存储到外部文件中
二、分析
学生类:
属性:
包含三个参数姓名(name)、年龄(age)、电话(tel);其中年龄age为int类型
方法:
__init__ 学生类的初始化方法
管理系统类:
属性:
学生列表 user_list
方法:
1.__init__ 管理系统初始化方法
2.增加学生
3.删除学生
4.修改学生
5.查询全部学生
6.查询单个学生
7.加载数据
8.保存数据
9.打印目录方法
数据文件:
文件名:stu_data.txt
三、优化
对于本项目,学生的信息在文件中存储是以列表套字典的格式进行存储,具体格式如图:
而在学生列表中则是以实例对象的方式进行存储,以减少内存占用,格式如图:
四、项目方法构造
学生类:
class Student(object):
def __init__(self, _name='', _age=0, _tel=''):
self.name = _name
self.age = _age
self.tel = _tel
self.stu_dict = {'name': self.name, 'age': self.age, 'tel': self.tel}
分析:学生类中使用 __init__ 方法定义三个学生属性参数;stu_dict 用来把学生对象转换成字典的形式保存
管理系统类:
1、载入数据
def data_into(self):
"""载入数据"""
# 判断文件是否存在 若不存在则退出
if not os.path.exists('./stu_data.txt'):
return
# 如果存在则对数据进行提取、载入,并以实例对象的形式保存到user_liast中
with open('stu_data.txt', 'r') as f:
# data_list 为临时变量, 临时保存数据列表
data_list = eval(f.read())
if data_list:
for each in data_list:
self.user_list.append(Student(each['name'], each['age'], each['tel']))
2、导出数据
def save_data(self):
"""导出数据"""
with open('stu_data.txt', 'w') as f:
data_list = []
# 把类对象的字典形式提取出来并转为str形式保存
# data_list为临时变量,临时保存列表
for each in self.user_list:
data_list.append(each.stu_dict)
f.write(str(data_list))
3、打印目录
@staticmethod
def show_menu():
print('-' * 20)
print('= 1. 添加学生')
print('= 2. 删除学生')
print('= 3. 修改学生')
print('= 4. 查询全部学生')
print('= 5. 查询某个学生')
print('= 6. 保存信息')
print('= 7. 退出系统')
print('-' * 20)
4、增加学生信息
def add_stu(self):
"""添加学生"""
name = input('请输入要添加学生的姓名: ')
# 如果学生姓名重复则重新输入
while True:
for each in self.user_list:
if name == each.name:
print('该学生已存在')
name = input('请重新输入: ')
break
else:
break
age = int(input('请输入学生年龄: '))
tel = input('请输入学生电话: ')
# 在user_list中追加新的学生实例对象
self.user_list.append(Student(name, age, tel))
print('添加成功')
5、删除某个学生信息
def del_stu(self):
"""删除学生信息"""
name = input('请输入要删除的学生姓名: ')
# 循环判断学生是否存在
for i, each in enumerate(self.user_list):
if each.name == name:
self.user_list.pop(i)
print('删除成功!')
break
else:
print('查无此人!')
6、修改某个学生信息
def update_stu(self):
"""修改某个学生"""
name = input('请输入要修改的学生姓名: ')
for i, each in enumerate(self.user_list):
if each.name == name:
# 使用 while True 保证修改后的学生不重复
while True:
name = input('请输入修改后的姓名: ')
for stu in self.user_list:
if stu.name == name:
print('该学生已存在, 请重新输入')
break
else:
break
age = int(input('输入修改后的年龄: '))
tel = input('输入修改后的电话: ')
self.user_list[i] = Student(name, age, tel)
print('修改成功')
break
else:
print('查无此人!')
7、查询全部学生
def show_all_stu(self):
"""查询所有学生"""
print('序号\t\t\t姓名\t\t\t年龄\t\t\t电话')
for i, each in enumerate(self.user_list):
print(f"{i+1}\t\t\t{each.name}\t\t{each.age}\t\t\t{each.tel}")
8、查询单个学生
def show_all_stu(self):
"""查询所有学生"""
# 如果存在学生信息则打印,若没有信息则提示为空
if self.user_list:
print('序号\t\t\t姓名\t\t\t年龄\t\t\t电话')
for i, each in enumerate(self.user_list):
print(f"{i + 1}\t\t\t{each.name}\t\t\t{each.age}\t\t\t{each.tel}")
else:
print('没有学生信息!')
9、开始运行函数
def start(self):
# 在系统开始时加载数据
self.data_into()
# 通过死循环来保证程序不主动退出
while True:
System.show_menu()
choose = input('请输入操作: ')
if choose == '1':
self.add_stu()
elif choose == '2':
self.del_stu()
elif choose == '3':
self.update_stu()
elif choose == '4':
self.show_all_stu()
elif choose == '5':
self.show_one_stu()
elif choose == '6':
print('保存成功')
self.save_data()
# 如果退出前不保存,不会自动保存数据
elif choose == '7':
print('退出系统...')
break
else:
print('输入错误, 请重新输入...')
五、运行截图
添加学生:
修改学生:
删除学生:
六、案例代码
import os
class Student(object):
def __init__(self, _name='', _age=0, _tel=''):
self.name = _name
self.age = _age
self.tel = _tel
self.stu_dict = {'name': self.name, 'age': self.age, 'tel': self.tel}
class System(object):
def __init__(self):
self.user_list = []
@staticmethod
def show_menu():
print('-' * 20)
print('= 1. 添加学生')
print('= 2. 删除学生')
print('= 3. 修改学生')
print('= 4. 查询全部学生')
print('= 5. 查询某个学生')
print('= 6. 保存信息')
print('= 7. 退出系统')
print('-' * 20)
def add_stu(self):
"""添加学生"""
name = input('请输入要添加学生的姓名: ')
# 如果学生姓名重复则重新输入
while True:
for each in self.user_list:
if name == each.name:
print('该学生已存在')
name = input('请重新输入: ')
break
else:
break
age = int(input('请输入学生年龄: '))
tel = input('请输入学生电话: ')
# 在user_list中添加新的学生实例对象
self.user_list.append(Student(name, age, tel))
print('添加成功')
# 2, 删除
def del_stu(self):
"""删除学生信息"""
name = input('请输入要删除的学生姓名: ')
# 循环判断学生是否存在
for i, each in enumerate(self.user_list):
if each.name == name:
self.user_list.pop(i)
print('删除成功!')
break
else:
print('查无此人!')
# 3. 修改
def update_stu(self):
"""修改某个学生"""
name = input('请输入要修改的学生姓名: ')
for i, each in enumerate(self.user_list):
if each.name == name:
# 使用 while True 保证修改后的学生不重复
while True:
name = input('请输入修改后的姓名: ')
for stu in self.user_list:
if stu.name == name:
print('该学生已存在, 请重新输入')
break
else:
break
age = int(input('输入修改后的年龄: '))
tel = input('输入修改后的电话: ')
self.user_list[i] = Student(name, age, tel)
print('修改成功')
break
else:
print('查无此人!')
# 4. 查询所有
def show_all_stu(self):
"""查询所有学生"""
# 如果存在学生信息则打印,若没有信息则提示为空
if self.user_list:
print('序号\t\t\t姓名\t\t\t年龄\t\t\t电话')
for i, each in enumerate(self.user_list):
print(f"{i + 1}\t\t\t{each.name}\t\t\t{each.age}\t\t\t{each.tel}")
else:
print('没有学生信息!')
# 5. 查询某个
def show_one_stu(self):
"""查询单个学生"""
name = input('输入要查询的学生姓名: ')
for each in self.user_list:
if each.name == name:
print(f"{each.name}\t\t{each.age}\t\t{each.tel}")
break
else:
print('查无此人')
def data_into(self):
"""载入数据"""
# 判断文件是否存在 若不存在则退出
if not os.path.exists('./stu_data.txt'):
return
# 如果存在则对数据进行提取、载入,并以实例对象的形式保存到user_liast中
with open('stu_data.txt', 'r') as f:
data_list = eval(f.read())
for each in data_list:
self.user_list.append(Student(each['name'], each['age'], each['tel']))
# self.user_list = [Student(each['name'], each['age'], each['tel']) for each in data_list]
def save_data(self):
"""导出数据"""
with open('stu_data.txt', 'w') as f:
data_list = []
# 把类对象的字典形式提取出来并转为str形式保存
# data_list为临时变量,临时保存列表
for each in self.user_list:
data_list.append(each.stu_dict)
f.write(str(data_list))
def start(self):
# 在系统开始时加载数据
self.data_into()
# 通过死循环来保证程序不主动退出
while True:
System.show_menu()
choose = input('请输入操作: ')
if choose == '1':
self.add_stu()
elif choose == '2':
self.del_stu()
elif choose == '3':
self.update_stu()
elif choose == '4':
self.show_all_stu()
elif choose == '5':
self.show_one_stu()
elif choose == '6':
print('保存成功')
self.save_data()
# 如果退出前不保存,不会自动保存数据
elif choose == '7':
print('退出系统...')
break
else:
print('输入错误, 请重新输入...')
manager = System()
manager.start()
七、总结
1、在管理系统类中要用Student实例对象来当学生信息并保存到学生列表user_list 中。
2、载入数据时要判断是否为空,否则用 r 读取会报错。
3、保存数据要先将学生列表 user_list 中的数据变为字典格式的数据,再用 w 模式保存到文件中,注意保存的格式为 字符串str 型。
4、这个系统是把学生姓名当作唯一不可改变的变量来使用,也可以根据实际情况来选择唯一变量;唯一变量是判断两个数据是否重复的唯一标准。