Skip to content

学生管理系统 - 面向对象版本


项目简介

学生管理系统旨在提供一个简洁、高效的解决方案,用于管理学校中学生的个人信息。该系统将支持学生数据的增删改查操作,并以科学化、系统化和规范化的方式维护信息。


实现方式

以面向对象思想及方式完成代码开发。


知识点

  • 输入和输出
  • 变量
  • 列表
  • 字符串
  • 流程控制
  • 面向对象概念
  • 类和对象
  • 实例属性
  • 实例方法
  • 访问控制权限
  • 初始化方法
  • 对象描述方法

项目要求

  • 定义学生类 Student,学生信息包含:

    • 编号: sid
    • 姓名: name
    • 年龄: age
    • 性别: gender
  • 实现构造方法及对象描述方法

    • __init__ : 初始化方法,接收对应参数初始化对象属性
    • __str__ : 实现对象描述方法,输出学生信息
  • 定义管理类 StudentManagement,用来实现整体业务逻辑。
    • 使用列表做为属性保存学生对象信息
  • 定义 manager 方法管理业务逻辑
    • 对用户输入内容进行输入校验
    • 根据用户输入内容选择不同功能执行

  • 实现菜单方法 __menu,输出下列菜单信息,并返回用户输入的编号

    print("*****************************")
    print("*      学生管理系统           *")
    print("* 1. 添加新学生信息           *")
    print("* 2. 通过学号修改学生信息      *")
    print("* 3. 通过学号删除学生信息      *")
    print("* 4. 通过姓名删除学生信息      *")
    print("* 5. 通过学号查询学生信息      *")
    print("* 6. 通过姓名查询学生信息      *")
    print("* 7. 显示所有学生信息         *")
    print("* 8. 退出系统                *")
    print("*****************************")
    

  • 因程序中需要多次对编号及姓名进行输入,故抽取方法获取对应的数据。

    • 获取编号方法 __get_sid, 输入编号并返回(字符串类型)eg. s01
    • 获取姓名方法 __get_name, 输入姓名并返回(字符串类型)
    • 获取姓名方法 __get_age, 输入年龄并返回(整型)
    • 获取姓名方法 __get_gender, 输入性别并返回(字符串类型)
  • 实现添加学生方法 add_student

    • 方法参数为 编号姓名年龄性别四个参数
    • 输出添加操作的结果提示信息
    • 返回对应结果信息
    • 要求编号不可重复。
  • 实现通过编号修改学生信息方法 modify_student_by_id
    • 参数为 学号
    • 如果学生存在,则进行修改,不存在输出提示信息
    • 返回是否修改成功

  • 实现通过学号删除学生方法 delete_student_by_id

    • 参数为 学号
    • 如果学生存在,则进行删除并输出提示信息,不存在则仅输出提示
    • 返回是否删除成功
  • 实现通过姓名删除学生方法 delete_student_by_name
    • 参数为 姓名
    • 如果学生存在,则进行删除(同名学生全部删除)并输出提示信息,不存在则仅输出提示
    • 返回是否删除成功

  • 实现通过学号查询学生方法 query_student_by_id

    • 参数为 学号
    • 如果学生存在,则输出学生信息,不存在输出提示信息
    • 返回是否查询成功
  • 实现通过姓名查询学生方法 query_student_by_name

    • 参数为 姓名
    • 如果学生存在,则输出学生信息(同名学生全部输出),不存在输出提示信息
    • 返回是否查询成功
  • 实现显示所有学生信息方法 __show
    • 输出所有学生信息

实战思路

uml diagram


实战代码

# 定义一个学生类
class Student:

    # 使用构造函数,接收实例化类时需要传入的参数
    def __init__(self, sid, name, age, gender):
        # 使用实例属性接收传入的值
        self.sid = sid
        self.name = name
        self.age = age
        self.gender = gender

    # 重写对象的显示格式方法
    def __str__(self):
        return f"SID: {self.sid} --- Name: {self.name} --- Age: {self.age} --- Gender: {self.gender}"
# 封装管理类
class StudentManagement:

    def __init__(self):
        # 定义一个实例变量,用来保存学生的信息,方法各个方法之间进行访问
        # 把这个实例变量设置为私有,只能让类中方法对其进行操作
        self.__students = []

    def __menu(self):
        '''
        菜单函数:展示学生管理系统菜单信息,并获取用户输入
        :return:  用户输入的编号字符串
        '''
        print("****************************************")
        print("*                学生管理系统             *")
        print("*        1. 添加新学生信息                 *")
        print("*        2. 通过学号修改学生信息              *")
        print("*        3. 通过学号删除学生信息              *")
        print("*        4. 通过姓名删除学生信息              *")
        print("*        5. 通过学号查询学生信息              *")
        print("*        6. 通过姓名查询学生信息              *")
        print("*        7. 显示所有学生信息               *")
        print("*        8. 退出系统                    *")
        print("****************************************")
        select_op = input("输入编号选择操作:")
        return select_op

    def __get_sid(self):
        '''
        获取用户输入的学号
        :return: 返回学号字符串
        '''
        sid = input("请输入学生ID:")
        return sid

    def __get_name(self):
        '''
        获取用户输入的姓名
        :return: 返回姓名字符串
        '''
        name = input("请输入学生名称:")
        return name

    def __get_age(self):
        '''
        获取用户输入的年龄
        :return: 返回年龄字符串
        '''
        while True:
            age = input("请输入学生年龄:")
            if age.isdigit():
                return int(age)
            else:
                print("输入年龄不合法,请输入数字")

    def __get_gender(self):
        '''
        获取用户输入的性别
        :return: 返回性别字符串
        '''
        gender = input("请输入学生性别:")
        return gender

    def add_student(self, sid, name, age, gender):
        '''
        添加学生
        :param sid: 学生 id
        :param name: 学生姓名
        :param age: 学生年龄
        :param gender: 学生性别
        :return: 操作提示信息
        '''
        for s in self.__students:
            if s.sid == sid:
                print("学生编号已存在,添加失败")
                return "添加失败"
        else:
            student = Student(sid, name, age, gender)
            self.__students.append(student)
            print("添加学生信息成功")
            return '添加成功'

    def modify_student_by_id(self, sid, name, age, gender):
        '''
        通过学号修改学生信息
        :param sid: 学生学号
        :return: 操作提示信息
        '''
        for s in self.__students:
            if s.sid == sid:
                s.name = name
                s.age = age
                s.gender = gender
                print("修改成功")
                return "修改成功"
        else:
            print(f'没有 {sid} 对应的学生信息')
            return "修改失败"

    def delete_student_by_id(self, sid):
        '''
        通过ID删除学生信息
        :param sid: 学生学号
        :return: 操作提示信息
        '''
        for s in self.__students:
            if s.sid == sid:
                self.__students.remove(s)
                print("删除成功")
                return "删除成功"
        else:
            print(f'没有 {sid} 对应的学生信息')
            return "删除失败"

    def delete_student_by_name(self, name):
        '''
        通过学生姓名 删除所有符合的学生
        :param name: 学生姓名
        :return: 操作提示信息
        '''
        exist_s = []
        # 找出所有要删除的学生
        for s in self.__students:
            if s.name == name:
                exist_s.append(s)

        # 开始删除
        if len(exist_s) > 0:
            for s in exist_s:
                self.__students.remove(s)
                print(f"名称为 { name } 的学生删除成功")
            else:
                print(f"成功删除 {len(exist_s)} 个学生")
                return "删除成功"
        else:
            print(f"学生【{name}】不存在,无法删除")
            return "删除失败"

    def query_student_by_id(self, sid):
        '''
        通过学号查询学生信息
        :param sid: 学生学号
        :return: 操作提示信息
        '''
        for s in self.__students:
            if s.sid == sid:
                print(f"学生编号 {sid} 的学生信息如下:")
                print(f"学号:{s.sid},姓名:{s.name},年龄:{s.age},性别:{s.gender}")
                return "查询成功"
        else:
            print(f"学生编号 {sid} 的学生不存在")
            return "查询失败"

    def query_student_by_name(self, name):
        '''
        通过姓名查询学生信息
        :param name:
        :return: 操作提示信息
        '''
        exist_s = []
        for s in self.__students:
            if s.name == name:
                exist_s.append(s)

        if len(exist_s) > 0:
            print(f"名称为 {name} 的学生共 {len(exist_s)} 名,信息如下:")
            for s in exist_s:
                print(f"学号:{s.sid},姓名:{s.name},年龄:{s.age},性别:{s.gender}")
            return "查询成功"
        else:
            print(f"名称为 {name} 的学生不存在")
            return "查询失败"

    def show(self):
        '''
        显示所有学生信息
        :return: 格式化的学生信息
        '''
        print("所有学生信息如下:")
        for s in self.__students:
            print(f"学号:{s.sid},姓名:{s.name},年龄:{s.age},性别:{s.gender}")

    def manager(self):
        '''
        管理方法
        :return:
        '''
        while True:
            select_op = self.__menu()
            if len(select_op) == 1 and select_op in "12345678":
                if select_op == "1":
                    sid = self.__get_sid()
                    name = self.__get_name()
                    age = self.__get_age()
                    gender = self.__get_gender()
                    self.add_student(sid, name, age, gender)
                elif select_op == "2":
                    sid = self.__get_sid()
                    name = self.__get_name()
                    age = self.__get_age()
                    gender = self.__get_gender()
                    self.modify_student_by_id(sid, name, age, gender)
                elif select_op == "3":
                    sid = self.__get_sid()
                    self.delete_student_by_id(sid)
                elif select_op == "4":
                    name = self.__get_name()
                    self.delete_student_by_name(name)
                elif select_op == "5":
                    sid = self.__get_sid()
                    self.query_student_by_id(sid)
                elif select_op == "6":
                    name = self.__get_name()
                    self.query_student_by_name(name)
                elif select_op == "7":
                    self.show()
                else:
                    break
            else:
                print("输入的数据不合法,请输入在合法范围内的操作编号!!!")


# 程序入口
if __name__ == '__main__':
    # 获取学生管理系统实例
    sm = StudentManagement()
    # 通过实例调用实例方法
    sm.manager()

总结

  • 项目简介
  • 实现方式
  • 实战思路
  • 功能拆解
  • 实战代码