面向对象案例:学生管理系统

软件开发的大致流程
  1. 产品经理:将用户的需求,写成产品规格说明文档

  2. 程序员:需求分析–>架构设计(概要设计/详细设计)–>编码–>单元(类/函数)测试

  3. 测试员:自动化测试

  4. 上线/维护

面向对象案例:学生管理系统
  • 目的:通过案例熟悉面向对象的设计思想,掌握Python面向对象编程的语法

  • 需求:实现对学生信息的增加、删除、修改和查询。

架构设计:
  • 界面选择使用控制台(也可以使用Web等等)。
  1. 识别对象(MVC三大类):界面视图类(V) 逻辑控制类© 数据模型类(M)

    • Model:描述需要处理的数据的模型(类)

    • View:负责处理界面逻辑

    • Controller:负责处理业务逻辑
      在这里插入图片描述

  2. 分配职责:

    1. 界面视图类:负责处理界面逻辑,比如显示菜单,获取输入,显示结果等。

    2. 逻辑控制类:负责存储学生信息,处理业务逻辑。比如添加、删除等

    3. 数据模型类:定义需要处理的数据类型。比如学生信息。

  3. 建立交互:界面视图对象 <----> 数据模型对象 <----> 逻辑控制对象设计

    • C和M的交互:M生成的对象作为参数传递给C类方法体中进行相关的业务处理。同时C类对象调用一个方法时会调用

    • C和V的交互:界面类需要使用逻辑控制类对象的数据和方法:需要多次操作同一个实例化对象,所以在界面类的构造函数中创建逻辑控制类对象

编码

根据分析结果,封装成以下三个类,每个类的具体数据和行为如下

  • 界面视图类:StudentManagerView
  1. 数据:逻辑控制对象__manager

  2. 行为:

    1. 显示菜单__display_menu:在控制台打印选项

    2. 选择菜单项__select_menu_item:输入一个数字,通过条件语句调用对应的方法

      1. 输入学生__input_students:

      2. 输出学生__output_students:

      3. 删除学生__delete_student,

      4. 修改学生信息__modify_student,

      5. 按成绩输出学生__output_student_by_score

    3. 入口逻辑main:循环调用__display_menu和__select_menu_item

  • 数据模型类:StudentModel

    • 数据:编号 id,姓名 name,年龄 age,成绩 score
    • 使用@property属性将以上数据设置成只读,
  • 逻辑控制类:StudentManagerController

  1. 数据:学生列表 __stu_list(列表元素是StudentModel类对象)

  2. 行为:

    1. 获取列表 stu_list:只允许获取列表,不允许修改,使用标准属性property进行封装

    2. 添加学生 add_student:先成一个StudentModel对象,修改id(可定义一个id生成器方法),然后添加到__stu_list列表中

    3. 删除学生remove_student:接收一个id,根据id在列表 stu_list找到对象,删除掉

    4. 修改学生update_student:接收一个id,根据id在列表 stu_list找到对象,修改对象变量

    5. 根据成绩排序order_by_score:使用列表切片方法,生成一个新的列表,然后将列表中元素两两比较(标记元素的score属性),进行排序。

完整代码
   """
     学生管理器系统
   """

   class StudentModel:
     """
       学生数据模型
     """

     def __init__(self, name="", age=0, score=0, id=0):
       self.name = name
       self.age = age
       self.score = score
       self.id = id

     @property
     def name(self):
       return self.__name

     @name.setter
     def name(self, value):
       self.__name = value

     @property
     def age(self):
       return self.__age

     @age.setter
     def age(self, value):
       self.__age = value

     @property
     def score(self):
       return self.__score

     @score.setter
     def score(self, value):
       self.__score = value

     @property
     def id(self):
       return self.__id

     @id.setter
     def id(self, value):
       self.__id = value


   class StudentManagerController:
     """
       逻辑控制类
     """

     def __init__(self):
       # 数据结果:[StudentModel(...),StudentModel(...)]
       self.__stu_list = []

     @property
     def stu_list(self):
       return self.__stu_list

     def add_student(self, new_stu):
       """
         添加学生
       :param new_stu: 没有id的新学生
       """
       new_stu.id = self.__generate_id()
       self.__stu_list.append(new_stu)

     def __generate_id(self):
       # 最后一个学生编号+1
       return self.__stu_list[-1].id + 1 if len(self.__stu_list) > 0 else 1

     def remove_student(self, remove_id):
       # 根据id删除学生
       for item in self.__stu_list:
         if item.id == remove_id:
           self.__stu_list.remove(item)
           return True
         return False

     def update_student(self, stu_info, id):
       # 根据id修改学生

       for item in self.__stu_list:
         if item.id == id:
           item.id = id
           item.name = stu_info.name
           item.score = stu_info.score
           item.age = stu_info.age
           return True
       return False

     def order_by_score(self):
       """
         根据成绩升序排列:
         两两比较,大于则交互位置,
       :return:
       """
       # 创建一个新的列表,进行操作,避免影响添加时id混乱
       sort_list = self.stu_list[:]
       for r in range(len(sort_list) - 1):
         for c in range(1, len(sort_list) - r):
           if sort_list[r].score > sort_list[r + c].score:
             sort_list[r], sort_list[r + c] = sort_list[r + c], sort_list[r]
       return sort_list


   class StudentManagerView:
     def __init__(self):
       self.__manager = StudentManagerController()

     @property
     def manager(self):
       return self.__manager

     def __display_menu(self):
       """
         显示菜单
       :return:
       """
       print("1)添加学生")
       print("2)显示学生")
       print("3)删除学生")
       print("4)修改学生")
       print("5)按成绩升序显示")

     def __select_menu_item(self):
       """
         选择菜单
       :return: 
       """
       number = input("请选择序号:")
       if number == "1":
         # 添加学生
         self.__input_student()
       elif number == "2":
         # 输出学生
         self.__out_student(self.manager.stu_list)
       elif number == "3":
         # 删除学生
         self.__delete_student()
       elif number == "4":
         # 修改学生
         self.__modify_student()
       elif number == "5":
         # 按成绩升序显示
         self.__out_student(self.__output_student_by_score())
       elif number == " ":
         # 退出循环
         return True

     def main(self):
       while True:
         self.__display_menu()
         if self.__select_menu_item():
           break

     def __input_student(self):
       """
         输入学生
       :return:
       """
       name = input("请输入姓名:")
       age = input("请输入年龄:")
       score = input("请输入成绩:")
       stu = StudentModel(name, int(age), int(score))
       self.manager.add_student(stu)

     def __out_student(self, list_stu):
       for item in list_stu:
         print("姓名:%s 年龄:%s 分数:%s 编号:%s" % (item.name, item.age, item.score, item.id))

     def __delete_student(self):
       id = int(input("请输入删除的学生id:"))
       self.manager.remove_student(id)

     def __modify_student(self):
       id = int(input("请输入修改的学生id:"))
       name = input("请输入姓名:")
       age = input("请输入年龄:")
       score = input("请输入成绩:")
       stu = StudentModel(name, int(age), int(score))
       self.manager.update_student(stu, id)

     def __output_student_by_score(self):
       return self.manager.order_by_score()

   # 实例界面视图类,调用main方法
   view = StudentManagerView()
   view.main()
  • 10
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Python面向对象程序设计的案例: 假设我们要设计一个学生管理系统,其中有两个类:Student 和Class。 ``` class Student: def __init__(self, name, age, gender, id): self.name = name self.age = age self.gender = gender self.id = id def display(self): print("Name:", self.name) print("Age:", self.age) print("Gender:", self.gender) print("ID:", self.id) class Class: def __init__(self, name, students): self.name = name self.students = students def add_student(self, student): self.students.append(student) def remove_student(self, student): self.students.remove(student) def display(self): print("Class Name:", self.name) print("Students:") for student in self.students: student.display() print("--------------------") ``` 以上代码中,Student 类表示一个学生,包含了学生的姓名、年龄、性别和学号等信息,并且有一个 display() 方法用于显示学生信息。 Class 类表示一个班级,包含了班级的名称和学生列表,并且有 add_student() 和 remove_student() 方法用于添加和删除学生,同时也有一个 display() 方法用于显示班级信息。 我们可以使用这两个类创建一个学生管理系统,例如: ``` s1 = Student("Tom", 18, "Male", "001") s2 = Student("Alice", 17, "Female", "002") s3 = Student("Bob", 19, "Male", "003") class1 = Class("Class A", [s1, s2]) class1.add_student(s3) class1.display() ``` 以上代码创建了三个学生 s1、s2、s3,其中 s1 和 s2 属于一个名为 Class A 的班级,s3 后来加入了这个班级。最后通过调用 class1.display() 方法,可以显示班级信息和所有学生的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值