⽬标

  • 了解⾯向对象开发过程中类内部功能的分析⽅法
  • 了解常⽤系统功能
    • 添加
    • 删除
    • 修改
    • 查询

⼀. 系统需求
使⽤⾯向对象编程思想完成学员管理系统的开发,具体如下:

  • 系统要求:学员数据存储在⽂件中
  • 系统功能:添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退出系统等功能。

⼆. 准备程序⽂件
2.1 分析

  • 角色分析
    • 学员
    • 管理系统

      ⼯作中注意事项

      1. 为了⽅便维护代码,⼀般⼀个⻆⾊⼀个程序⽂件;
      2. 项⽬要有主程序⼊⼝,习惯为 main.py

2.2 创建程序⽂件
创建项⽬⽬录,例如: StudentManagerSystem
程序⽂件如下:
程序⼊⼝⽂件:main.py
学员⽂件:student.py
管理系统⽂件:managerSystem.py
三. 书写程序
3.1 student.py
需求:
学员信息包含:姓名、性别、⼿机号;
添加 str 魔法⽅法,⽅便查看学员对象信息
3.1.2 程序代码

  1. class Student(object):
  2. def __init__(self, name, gender, tel):
  3. self.name = name
  4. self.gender = gender
  5. self.tel = tel
  6. def __str__(self):
  7. return f'{self.name}, {self.gender}, {self.tel}'

3.2 managerSystem.py
需求:

  • 存储数据的位置:⽂件(student.data)
    • 加载⽂件数据
    • 修改数据后保存到⽂件
  • 存储数据的形式:列表存储学员对象
  • 系统功能
    • 添加学员
    • 删除学员
    • 修改学员
    • 查询学员信息
    • 显示所有学员信息
    • 保存学员信息
    • 退出系统

3.2.1 定义类

  1. class StudentManager(object):
  2. def __init__(self):
  3. # 存储数据所⽤的列表
  4. self.student_list = []

3.2.2 管理系统框架
需求:系统功能循环使⽤,⽤户输⼊不同的功能序号执⾏不同的功能。

  • 步骤

    • 定义程序⼊⼝函数
      • 加载数据
      • 显示功能菜单
      • ⽤户输⼊功能序号
      • 根据⽤户输⼊的功能序号执⾏不同的功能
    • 定义系统功能函数,添加、删除学员等

      1. class StudentManager(object):
      2. def __init__(self):
      3. # 存储数据所⽤的列表
      4. self.student_list = []
      5. # ⼀. 程序⼊⼝函数,启动程序后执⾏的函数
      6. def run(self):
      7. # 1. 加载学员信息
      8. self.load_student()
      9. while True:
      10. # 2. 显示功能菜单
      11. self.show_menu()
      12. # 3. ⽤户输⼊功能序号
      13. menu_num = int(input('请输⼊您需要的功能序号:'))
      14. # 4 根据⽤户输⼊的功能序号执⾏不同的功能
      15. if menu_num == 1:
      16. # 添加学员
      17. self.add_student()
      18. elif menu_num == 2:
      19. # 删除学员
      20. self.del_student()
      21. elif menu_num == 3:
      22. # 修改学员信息
      23. self.modify_student()
      24. elif menu_num == 4:
      25. # 查询学员信息
      26. self.search_student()
      27. elif menu_num == 5:
      28. # 显示所有学员信息
      29. self.show_student()
      30. elif menu_num == 6:
      31. # 保存学员信息
      32. self.save_student()
      33. elif menu_num == 7:
      34. # 退出系统
      35. break
      36. # ⼆. 定义功能函数
      37. # 2.1 显示功能菜单
      38. @staticmethod
      39. def show_menu():
      40. print('请选择如下功能-----------------')
      41. print('1:添加学员')
      42. print('2:删除学员')
      43. print('3:修改学员信息')
      44. print('4:查询学员信息')
      45. print('5:显示所有学员信息')
      46. print('6:保存学员信息')
      47. print('7:退出系统')
      48. # 2.2 添加学员
      49. def add_student(self):
      50. pass
      51. # 2.3 删除学员
      52. def del_student(self):
      53. pass
      54. # 2.4 修改学员信息
      55. def modify_student(self):
      56. pass
      57. # 2.5 查询学员信息
      58. def search_student(self):
      59. pass
      60. # 2.6 显示所有学员信息
      61. def show_student(self):
      62. pass
      63. # 2.7 保存学员信息
      64. def save_student(self):
      65. pass
      66. # 2.8 加载学员信息
      67. def load_student(self):
      68. pass

      3.3 main.py ```python

      1. 导⼊managerSystem模块

      from managerSystem import *

2. 启动学员管理系统

if name == ‘main‘: student_manager = StudentManager() student_manager.run()

  1. **3.4 定义系统功能函数 **<br />**3.4.1 添加功能 **
  2. - 需求:⽤户输⼊学员姓名、性别、⼿机号,将学员添加到系统。
  3. - 步骤
  4. - ⽤户输⼊姓名、性别、⼿机号
  5. - 创建该学员对象
  6. - 将该学员对象添加到列表
  7. - 代码
  8. ```python
  9. # 添加学员函数内部需要创建学员对象,故先导⼊student模块
  10. from student import *
  11. class StudentManager(object):
  12. ......
  13. # 2.2 添加学员
  14. def add_student(self):
  15. # 1. ⽤户输⼊姓名、性别、⼿机号
  16. name = input('请输⼊您的姓名:')
  17. gender = input('请输⼊您的性别:')
  18. tel = input('请输⼊您的⼿机号:')
  19. # 2. 创建学员对象:先导⼊学员模块,再创建对象
  20. student = Student(name, gender, tel)
  21. # 3. 将该学员对象添加到列表
  22. self.student_list.append(student)
  23. # 打印信息
  24. print(self.student_list)
  25. print(student)

3.4.2 删除学员

  • 需求:⽤户输⼊⽬标学员姓名,如果学员存在则删除该学员。
  • 步骤
    • ⽤户输⼊⽬标学员姓名
    • 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则删除,否则则提示该学员不存在。
  • 代码

      # 2.3 删除学员:删除指定姓名的学员 
      def del_student(self): 
          # 1. ⽤户输⼊⽬标学员姓名 
          del_name = input('请输⼊要删除的学员姓名:') 
          # 2. 如果⽤户输⼊的⽬标学员存在则删除,否则提示学员不存在 
          for i in self.student_list: 
              if i.name == del_name: 
                  self.student_list.remove(i) 
              break 
          else: 
              print('查⽆此⼈!') 
              # 打印学员列表,验证删除功能 
          print(self.student_list)
    

    3.4.3 修改学员信息

  • 需求:⽤户输⼊⽬标学员姓名,如果学员存在则修改该学员信息。

  • 步骤
    • ⽤户输⼊⽬标学员姓名;
    • 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则修改学员的姓名、性别、⼿机号数据,否则则提示该学员不存在。
  • 代码

      # 2.4 修改学员信息 
      def modify_student(self): 
          # 1. ⽤户输⼊⽬标学员姓名 
          modify_name = input('请输⼊要修改的学员的姓名:') 
          # 2. 如果⽤户输⼊的⽬标学员存在则修改姓名、性别、⼿机号等数据,否则提示学员不存在
    
          for i in self.student_list: 
              if i.name == modify_name: 
                  i.name = input('请输⼊学员姓名:') 
                  i.gender = input('请输⼊学员性别:') 
                  i.tel = input('请输⼊学员⼿机号:') 
                  print(f'修改该学员信息成功,姓名{i.name},性别{i.gender}, ⼿机号{i.tel}') 
                  break 
              else: 
                  print('查⽆此⼈!')
    

    3.4.5 查询学员信息

  • 需求:⽤户输⼊⽬标学员姓名,如果学员存在则打印该学员信息

  • 步骤
    • ⽤户输⼊⽬标学员姓名
    • 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则打印学员信息,否则提示该学员不存在。
  • 代码

      # 2.5 查询学员信息 
      def search_student(self): 
          # 1. ⽤户输⼊⽬标学员姓名 
          search_name = input('请输⼊要查询的学员的姓名:') 
    
          # 2. 如果⽤户输⼊的⽬标学员存在,则打印学员信息,否则提示学员不存在 
          for i in self.student_list: 
              if i.name == search_name: 
                  print(f'姓名{i.name},性别{i.gender}, ⼿机号{i.tel}') 
                  break 
              else: 
                  print('查⽆此⼈!')
    

    3.4.6 显示所有学员信息

  • 打印所有学员信息

  • 步骤
    • 遍历学员数据列表,打印所有学员信息
  • 代码

      # 2.6 显示所有学员信息 
      def show_student(self): 
          print('姓名\t性别\t⼿机号') 
          for i in self.student_list: 
              print(f'{i.name}\t{i.gender}\t{i.tel}')
    

    3.4.7 保存学员信息

  • 需求:将修改后的学员数据保存到存储数据的⽂件。

  • 步骤

    • 打开⽂件
    • ⽂件写⼊数据
    • 关闭⽂件

      思考

      1. ⽂件写⼊的数据是学员对象的内存地址吗?
      2. ⽂件内数据要求的数据类型是什么?
  • 拓展 dict

    class A(object): 
      a = 0 
      def __init__(self): 
          self.b = 1 
    aa = A() 
    # 返回类内部所有属性和⽅法对应的字典 
    print(A.__dict__) 
    # 返回实例属性和值组成的字典 
    print(aa.__dict__)
    

    在Python中

  • 代码

      # 2.7 保存学员信息 
      def save_student(self): 
          # 1. 打开⽂件 
          f = open('student.data', 'w') 
          # 2. ⽂件写⼊学员数据 
          # 注意1:⽂件写⼊的数据不能是学员对象的内存地址,需要把学员数据转换成列表字典数据再做存储 
          new_list = [i.__dict__ for i in self.student_list] 
          # [{'name': 'aa', 'gender': 'nv', 'tel': '111'}] 
          print(new_list) 
          # 注意2:⽂件内数据要求为字符串类型,故需要先转换数据类型为字符串才能⽂件写⼊数据 
          f.write(str(new_list)) 
          # 3. 关闭⽂件 
          f.close()
    

    3.4.8 加载学员信息

  • 需求:每次进⼊系统后,修改的数据是⽂件⾥⾯的数据

  • 步骤
    • 尝试以 “r” 模式打开学员数据⽂件,如果⽂件不存在则以 “w” 模式打开⽂件
    • 如果⽂件存在则读取数据并存储数据
      • 读取数据
      • 转换数据类型为列表并转换列表内的字典为对象
      • 存储学员数据到学员列表
    • 关闭⽂件
  • 代码
      # 2.8 加载学员信息 
      def load_student(self): 
          # 尝试以"r"模式打开数据⽂件,⽂件不存在则提示⽤户;⽂件存在(没有异常)则读取数据 
          try: 
              f = open('student.data', 'r') 
          except: 
              f = open('student.data', 'w') 
          else: 
              # 1. 读取数据 
              data = f.read()
              # 2. ⽂件中读取的数据都是字符串且字符串内部为字典数据,故需要转换数据类型再转换字典为对象后存储到学员列表 
              new_list = eval(data) 
              self.student_list = [Student(i['name'], i['gender'], i['tel']) for i in new_list] 
          finally: 
              # 3. 关闭⽂件 
              f.close()
    
    image.png