Skip to content

面向对象封装案例

面向对象版学生信息管理系统案例。

基于 基础知识-学生信息管理 进行面向对象版改写。

学生模型对象

学生模型对象最主要的作用就是将数据与对象之间进行转化。在实际做项目的时候,使用对象比使用数据方便的更多。

在之前的案例中是这样使用学生数据的:

python
student_list = [
    {'name': '张三', 'chinese': '65', 'math': '65', 'english': '65', 'total': 195},
    {'name': '李四', 'chinese': '65', 'math': '65', 'english': '65', 'total': 195},
    {'name': '王五', 'chinese': '65', 'math': '65', 'english': '65', 'total': 195}
]

zx = student_list[0]
print(zx['name'])

我们可以将其改造为面向对象的形式进行操作:

py
class Student:
    def __init__(self, name, chinese, math, english):
        self.name = name
        self.chinese = chinese
        self.math = math
        self.english = english

    def total(self):
        return self.chinese + self.math + self.english

    def to_json(self):
        return {
            'name': self.name,
            'chinese': self.chinese,
            'math': self.math,
            'english': self.english,
        }


data = {
    'name': '正心',
    'chinese': 60,
    'math': 60,
    'english': 60,
}
zx = Student(**data)
print(zx)
print(zx.to_json())

数据模型

在做项目的时候,一般会把对于数据的操作单独抽取出来,将其封装到一起,然后被业务代码进行调用。

py
import json


class Student:
    def __init__(self, name, chinese, math, english):
        self.name = name
        self.chinese = chinese
        self.math = math
        self.english = english

    def total(self):
        return self.chinese + self.math + self.english

    def to_json(self):
        return {
            'name': self.name,
            'chinese': self.chinese,
            'math': self.math,
            'english': self.english,
        }


class Database:
    def __init__(self, filename=None):
        if not filename:
            self.filename = 'student.json'
        self.student_list = []
        self._load()

    def _load(self):
        """将本地数据加载为对象"""
        with open(self.filename, mode='r', encoding='utf-8') as file:
            data = file.read()
            student_list = json.loads(data)
            for student in student_list:
                self.student_list.append(Student(**student))

    def save(self):
        """将数据保存到本地"""
        with open(self.filename, mode='w', encoding='utf-8') as file:
            student_list = []
            for student in self.student_list:
                student_list.append(student.to_json())
            data = json.dumps(student_list)
            file.write(data)

    def add(self, student):
        self.student_list.append(Student(**student))

    def change(self, student):
        stu = self.search_by_name(student['name'])
        stu.name = student['name']
        stu.math = student['math']
        stu.chinese = student['chinese']
        stu.english = student['english']

    def delete(self, name):
        stu = self.search_by_name(name)
        self.student_list.remove(stu)

    def search_by_name(self, name):
        for student in self.student_list:
            if student.name == name:
                return student
        return None

    def show_all(self):
        print('姓名\t\t语文\t\t数学\t\t英语\t\t总分')
        for stu in self.student_list:
            print("{}\t\t{}\t\t{}\t\t{}\t\t{}".format(stu.name, stu.chinese, stu.math, stu.english, stu.total()))


class StudentManager:
    def __init__(self):
        self.db = Database()
        self.str_info = """**************************************************
欢迎使用【学生信息管理系统】V1.0
请选择你想要进行的操作
1. 新建学生信息
2. 显示全部信息
3. 查询学生信息
4. 修改学生信息
5. 删除学生信息

0. 退出系统
**************************************************"""

    def add_student(self):
        name = input('请输入学生的姓名:')
        chinese = int(input('请输入学生的语文成绩:'))
        math = int(input('请输入学生的数学成绩:'))
        english = int(input('请输入学生的英语成绩:'))
        stu = Student(name=name, chinese=chinese, math=math, english=english)
        self.db.add(stu.to_json())

    def change_student(self):
        name = input('请输入你想要修改的学生姓名:')
        stu = self.db.search_by_name(name)
        if stu:
            name = input('请重新输入学生的名字:')
            chinese = input('请重新输入学生的语文成绩:')
            math = input('请重新输入学生的数学成绩:')
            english = input('请输重新入学生的英语成绩:')
            self.db.change({'name': name, 'chinese': chinese, 'math': math, 'english': english})
        else:
            print(f'{name} 不存在')

    def run(self):
        while True:
            print(self.str_info)
            action = input('请选择你想要进行的操作:')
            if action == '1':
                self.add_student()
            elif action == '2':
                self.db.show_all()
            elif action == '3':
                name = input('请输入你想要查询的学生姓名:')
                stu = self.db.search_by_name(name)
                print(stu)
            elif action == '4':
                self.change_student()
            elif action == '5':
                name = input('请输入你想要删除的学生姓名:')
                stu = self.db.search_by_name(name)
                if stu:
                    self.db.delete(name)
                else:
                    print(f'{name} 不存在')
            elif action == '0':
                self.db.save()
                print('0. 退出系统')
                break
            else:
                print('请输入正确的选择')


student_manager = StudentManager()

student_manager.run()

逻辑模型

这部分只负责对学生数据修改的逻辑