面向对象版学生名片管理系
# 增、删、改、查
import os
class Student(object):
"""学生类:保存学生的基本信息"""
def __init__(self, _name='mike', _age=18, _tel='110'):
self.name = _name
self.age = _age
self.tel = _tel
def __str__(self):
"""返回实例属性信息"""
# \t一个tab键的空格
return f'{self.name}\t{self.age}\t{self.tel}'
# 设计方法,返回一个字典格式的内容
def to_dict(self):
return {'name': self.name, 'age': self.age, 'tel': self.tel}
# 学生管理类,管理学生:增删改查学生信息
class ManagerStuSys(object):
# 1. 需要有个属性,专门保存学生对象,属性是列表
def __init__(self):
self.user_list = []
# 2. 测试,专门放学生信息
def test(self):
s1 = Student('mike', 34, '110')
s2 = Student('yoyo', 24, '120')
self.user_list.append(s1)
self.user_list.append(s2)
# 1. 从列表取出对象
for obj in self.user_list:
# 2. 打印的是对象, 打印obj str方法的返回值
print(obj)
# 显示菜单函数定义
@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_info(self):
"""添加学生信息"""
# 1. 输入用户信息:姓名、年龄、电话
_name = input('请输入学生姓名:')
_age = int(input('请输入学生年龄:')) # 年龄应该是整型,所有做了int转换
_tel = input('请输入学生电话:')
# 2. 通过for遍历,取出某个对象元素
for obj in self.user_list:
# 2.1 对象.name == 用户输入的名字,是否相等,相等则跳出循环
if obj.name == _name:
print('此用户已经存在,请重来')
# 2.2 break跳出循环
break
else:
# 3. for中的else 如果用户不存在列表中,创建对象,添加到列表
# 3.1 创建对象
obj = Student(_name, _age, _tel)
# 3.2 追加列表
self.user_list.append(obj)
# 显示所有的学生,带序号的
def show_all_stu(self):
"""显示所有的学生"""
# 1. 遍历前,打印一些提示信息:序号 姓名 年龄 电话
# \t一个tab键的空格
print('序号\t\t姓名\t\t年龄\t\t电话')
# 2. 遍历 for 索引位置,对象 in enumerate(列表):
for i, obj in enumerate(self.user_list):
# 2.1 打印一个用户的信息 索引位置+1,对象.属性……
print('%d\t\t%s\t\t%d\t\t%s' % (i + 1, obj.name, obj.age, obj.tel))
# 显示某个学生
def show_one_stu(self):
"""显示某个学生"""
# 1. 输入姓名
_name = input('请输入学生姓名:')
# 2. 通过for遍历,取出一个对象
for obj in self.user_list:
# 2.1 对象.name和输入姓名判断
if obj.name == _name:
# 2.1.1 如果相等,输出用户信息,退出循环
print('查询到的用户信息如下:')
print('%s\t%d\t%s' % (obj.name, obj.age, obj.tel))
break
# 3. for中的else,循环执行完毕,没有break,说明用户不存在,提示一下
else:
print('查询的用户不存在')
def update_stu_by_name(self):
"""更新某个学生信息,根据输入的姓名匹配哪个学生"""
# 1. 输入需要修改的用户姓名
update_name = input('输入需要修改的用户姓名:')
# 2. for遍历,带索引的遍历 i, obj in 列表
for i, obj in enumerate(self.user_list):
# 2.1 如果obj.name和输入用户名字相等
if obj.name == update_name:
# 2.1.1 重新输入新的姓名、年龄、电话
_name = input('请输入新的学生姓名:')
_age = int(input('请输入新的学生年龄:'))
_tel = input('请输入新的学生电话:')
# 2.1.2 对user_list[i].name = 新的name
self.user_list[i].name = _name
self.user_list[i].age = _age
self.user_list[i].tel = _tel
# 2.1.3 ……、修改成功打印、break跳出循环
print('修改成功')
break
# 3. for中的else 输入的用户不在列表
else:
print('输入的用户不在列表,请重新输入')
def del_stu_by_name(self):
"""删除某个学生,根据输入的姓名"""
# 1. 输入用户姓名
_name = input('请输入需要删除的名字:')
# 2. for遍历,带索引的遍历 i, obj in 列表
for i, obj in enumerate(self.user_list):
# 2.1 如果obj.name和输入用户名字相等
if obj.name == _name:
# 2.1.1 del 列表[i], 同时break跳出循环
del self.user_list[i]
print('删除成功')
break
# 3. for中else 输入的用户在列表中,不存在
else:
print('用户不在列表中,无法删除')
# 1.3 名片信息保存到文件 函数的设计
def save_info(self):
"""名片信息保存到文件"""
# 1. 将[对象1, 对象2] 转换为 [{}, {}]
new_list = []
for obj in self.user_list:
temp_dict = {'name': obj.name, 'age': obj.age, 'tel': obj.tel}
new_list.append(temp_dict)
# 2. str([{}, {}])转换后,写入文件
with open('stu.txt', 'w') as f:
f.write(str(new_list))
print('文件保存成功')
def load_info(self):
"""加载数据"""
# 2.2 判断文件是否存在,不存在,中断函数
# 文件开头需要 import os
if not os.path.exists('stu.txt'):
print('文件不存在,无法加载')
return
# 2.3 文件存在的时候,加载数据
# 2.4 通过with打开文件,只读方式打开文件
with open('stu.txt', 'r') as f:
# 1. 从文件读出来的内容是字符串,通过eval转换为[{}, {}]
content = f.read()
stu_list = eval(content)
# 2. 从列表中取出字典,再取出字典的元素,这个元素用新建对象
for user_dict in stu_list:
obj = Student(user_dict['name'], user_dict['age'], user_dict['tel'])
# 3. 列表追加对象
self.user_list.append(obj)
print('数据成功加载')
# 3. 主逻辑程序,就是功能选择
def start(self):
# 加载文件
self.load_info()
# 1. 死循环
while True:
# 调用菜单
self.show_menu()
# 2. 用户输入数字
cmd = input("请输入功能数字:")
# 3. 条件选择
if cmd == "1":
print('添加学生')
self.add_stu_info()
elif cmd == "2":
print('查询所有学生')
self.show_all_stu()
elif cmd == "3":
print('查询某个学生')
self.show_one_stu()
elif cmd == "4":
print('修改某个学生')
self.update_stu_by_name()
elif cmd == "5":
print('删除某个学生')
self.del_stu_by_name()
elif cmd == '6':
print('保存文件')
self.save_info()
elif cmd == "7":
print('退出循环')
break
else:
print('输入有误,请重新输入')
# 创建对象,调用方法
ms = ManagerStuSys()
ms.start()