前言

(1) 使用面向对象、字符串、列表、字典、文件等知识点来完成一个学生管理系统 V2.0;

(2) 针对学生,该系统具有添加、修改、删除、查询所有学生、查询某个学生、保存信息、退出系统等操作;

一.student.py

记录Student类,属性为名字,性别,年龄,手机号,描述信息

 初始化方法:创建学生对象时,给学生赋值属性
        :param name: 姓名
        :param gender: 性别
        :param age: 年龄
        :param phone: 手机号
        :param desc: 个人描述

class Student:
    def __init__(self, name, gender, age, phone, desc):
        self.name = name
        self.gender = gender
        self.age = age
        self.phone = phone
        self.desc = desc

    def __str__(self):
        '''
        :return: 格式化的学生信息
        '''
        return f"学生姓名:{self.name},性别:{self.gender},年龄:{self.age},手机号:{self.phone},描述信息:{self.desc}"

测试:

# 测试
if __name__ == '__main__':
    # 创建学生对象
    s = Student('张三', '男', 18, '12436516', '好学生')
    # 打印学生对象(自动调用__str__方法)
    print(s)

测试结果:

二.StudentCMS.py

StudentCMS:学生管理系统核心类,封装所有业务逻辑:
初始化:默认学生数据 + 加载文件数据
界面:打印操作菜单
业务:增 / 删 / 改 / 查学生
持久化:文件保存 / 加载学生数据
主程序:循环交互、调度功能

2.1 包的导入

time.sleep():让菜单切换有短暂停顿,不卡顿

Student:封装了学生的姓名、性别、年龄、电话、描述5 个属性

import time  
from student import Student  

2.2 初始化信息

初始化学生的信息。

作用:系统启动 → 预置 3 个默认学生 → 加载本地保存的数据

    def __init__(self):
        self.stu_list = [
            Student('张三', '男', 23, 354635, '好学生'),
            Student('王二', '男', 26, 355346675, '好学生'),
            Student('李四', '男', 28, 3165255621, '好学生')
        ]
        self.load_student()

2.3 菜单栏

给用户展示操作菜单

from student import Student

class  Studentcms(object):
    def __init__(self):
        self.stu_list = []
    def show_view(self):
        print('*'*25)
        print('学生管理系统')
        print('\t1.添加学生信息')
        print('\t2.删除学生信息')
        print('\t3.修改学生信息')
        print('\t4.查询单个学生信息')
        print('\t5.查询所以学生信息')
        print('\t6保持学生信息')
        print('\t0.退出系统')
        print('*'*25)

测试:

#测试       
if __name__ == '__main__':
    cms = Studentcms()
    cms.show_view()

测试结果:

2.4 业务逻辑

学生管理系统的核心启动方法(start,属于面向对象的类实例方法,是整个系统的交互入口

核心作用是:持续显示操作菜单 → 接收用户输入 → 根据输入调用对应功能 → 直到用户主动退出

 def start(self):
        while True:
            time.sleep(0.5)
            self.show_view()  
            input_num = input('请输入您要操作的编号:')

            if input_num == '1':
                self.add_student()
            elif input_num == '2':
                self.del_student()
            elif input_num == '3':
                self.update_student()
            elif input_num == '4':
                self.search_one_student()
            elif input_num == '5':
                self.search_all_student()
            elif input_num == '6':
                self.save_student()
                print('保存学生信息成功!\n')
            elif input_num == '0':
                result = input('您确定要退出吗?(Y/N):')
                if result.lower() == 'y':
                    self.save_student()
                    print('谢谢您的使用,欢迎下次登入!')
                    break
                else:
                    print('已取消退出!\n')
            else:
                print('录入有误,请重新输入!\n')

菜单选择逻辑

输入编号对应功能特殊说明
1添加学生调用 add_student()
2删除学生调用 del_student()
3修改学生信息调用 update_student()
4查询单个学生调用 search_one_student()
5查询所有学生调用 search_all_student()
6手动保存学生信息保存后打印成功提示
0退出系统二次确认 + 退出前自动保存
其他输入错误提示重新输入

2.5 增删改查

:输入信息 → 新建学生 → 放进列表

:输入姓名 → 遍历找到 → 从列表删除

:输入姓名 → 遍历找到 → 重新赋值

:输入姓名 / 直接打印 → 显示学生信息

 def add_student(self):
        name = input('请输入学生姓名:')
        gender = input('请输入学生性别:')
        age = int(input('请输入学生年龄:'))
        phone = input('请输入学生电话:')
        desc = input('请输入学生描述信息:')

        stu = Student(name, gender, age, phone, desc)
        self.stu_list.append(stu)
        print(f'添加{name}学生信息成功!\n')

    def del_student(self):
        del_name = input('请输入要删除的学生姓名:')
        for stu in self.stu_list:
            if stu.name == del_name:
                self.stu_list.remove(stu)
                print(f'学生{del_name}删除成功!\n')
                break
        else:
            print('查无此人,请重新操作\n')

    def update_student(self):
        upd_name = input('请输入要修改的学生姓名:')
        for stu in self.stu_list:
            if stu.name == upd_name:
                stu.gender = input('请输入修改后的性别:')
                stu.age = int(input('请输入修改后的年龄:'))  # 修复缺少的冒号
                stu.phone = input('请输入修改后的电话:')
                stu.desc = input('请输入修改后的描述信息:')
                print(f'学生{upd_name}信息修改成功!\n')
                break
        else:
            print('查无此人,请重新操作\n')

    def search_one_student(self):
        search_name = input('请输入要查找的学生姓名:')
        for stu in self.stu_list:
            if stu.name == search_name:
                print(stu, end='\n\n')  # 修复致命bug:删除了错误的remove()
                break
        else:
            print('查无此人,请重新操作\n')

    def search_all_student(self):
        if len(self.stu_list) == 0:
            print('暂无学生信息,请添加后查询!\n')
        else:
            for stu in self.stu_list:
                print(stu)
            print()

2.6 保持信息

关闭程序,数据不会丢失!

原理:Python 对象不能直接存文件 → 转换成字典 → 写入 txt 文件

    def save_student(self):
        # 保存:对象转字典,写入文件
        with open('./stu_data.txt', 'w', encoding='utf-8') as dest_f:
            stu_dict = [stu.__dict__ for stu in self.stu_list]
            dest_f.write(str(stu_dict))

2.7  加载信息

原理:读取文件字符串 → 还原为字典 → 字典转回学生对象

此外这里还增加了异常处理

异常处理:文件不存在也不会崩溃

 def load_student(self):
        # 加载:修复模式为 r(只读),w会清空文件
        try:
            with open('./stu_data.txt', 'r', encoding='utf-8') as src_f:
                stu_data = src_f.read()
                if stu_data:  # 判断文件有内容再执行
                    stu_list = eval(stu_data)
                    self.stu_list = [Student(**stu_dict) for stu_dict in stu_list]
        except:
            # 文件不存在则创建空文件
            with open('./stu_data.txt', 'w', encoding='utf-8') as src_f:
                pass

三.main.py

这是项目启动的唯一入口,是运行整个系统的钥匙

if __name__ == '__main__' 是 Python 程序的标准入口

代码逻辑:导入类 → 创建对象 → 初始化数据 → 启动系

from StudentCMS import Studentcms
if __name__ == '__main__':
    cms = Studentcms()
    cms.start()

四.扩展

文件无法直接存储 Python 对象,只能存储字符串、数字、字典等基础数据。

__dict__可以把对象转化为字典

从 学生->字典,[学生,学生,学生]->[字典,字典,字典],字典->对象三个角度

from  student import Student
# 学生->字典
s1 = Student('张三','男',23,354635,'好学生')

my_dict = s1.__dict__
print(my_dict)
print(type(my_dict))
print('-'*25)

#[学生,学生,学生]->[字典,字典,字典]
s1 = Student('张三','男',23,354635,'好学生')
s2 = Student('王二', '男', 26, 355346675, '好学生')
s3 = Student('李四', '男', 28, 3165255621, '好学生')

stu_list =  [s1,s2,s3]

list_dict = [stu.__dict__ for stu in stu_list]
print(stu_list)
print('-'*25)

#字典->对象
my_dict = {'name':'张三','gender':'男','age':23,'phone':354635,'desc':'好学生'}
s5 = Student(my_dict['name'],my_dict['gender'],my_dict['age'],my_dict['phone'],my_dict['desc'])
print(s5)
print(type(s5))
print('-'*25)

s6 =  Student(**my_dict)
print(s6)
print(type(s6))

**字典字典转对象的最优解,自动解包关键字参数,代码极简。

结果:

更多推荐