目录

Python面向对象(7)面向对象版学员管理系统

Python面向对象(7)面向对象版学员管理系统

学习目标

  • 了解面向对象开发过程中类内部功能的分析方法
  • 了解常用的系统功能:增删改查

系统需求

使用面向对象编程思想完成学员管理系统的开发,具体如下:

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

准备程序文件

角色分析:1.学员;2.管理系统

工作中注意:1. 为了方便维护代码,一般一个角色一个程序文件;2. 项目要有主程序入口,习惯为main.py

创建程序文件:

首先创建项目目录:例如:StudentManagerSystem程序文件:

  • 程序入口文件:main.py
  • 学员类文件:student.py
  • 管理系统文件:managersystem.py

代码框架实现

student.py

之所以先写student.py这个文件,是因为先有学员数据信息,所以对数据信息进行处理后才能进行系统的处理,它的需求如下:

  • 学员信息包含:姓名、性别、手机号;
  • 添加__str__魔法方法,方便查看学员对象信息。

程序代码:

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

managersystem.py

这个文件是管理系统的代码,它的需求如下:

  • 存储数据的位置,是在文件中,文件名为student.data,数据可以被加载,可以被修改和保存。
  • 存储数据的形式:列表存储学员对象。
  • 系统功能:
    • 添加学员
    • 删除学员
    • 修改学员
    • 查询学员信息
    • 显示所有学员信息
    • 保存学员信息

定义类:

1
2
3
class managerSystem():
    def __init__(self):
        self.student_list = []  # 存储数据用的列表

管理系统的框架:

需求:系统功能循环使用,用户输入不同的功能序号可以执行不同的功能。

  • 步骤:
    • 定义程序入口函数:
      • 加载数据
      • 显示功能菜单
      • 用户输入功能序号
      • 根据用户输入的功能序号执行不同的功能
    • 定义系统功能函数,添加、删除学员等
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class ManagerSystem():
    def __init__(self):
        self.student_list = []  # 存储数据用的列表
    # 入口函数开始 一般定义为run函数
    def run(self):
        self.load_student() # 加载数据调用实例方法
        while True:     # 显示功能菜单
            self.show_menu()
            menu_num = input("请输入您需要的功能序号:")
            if menu_num == '1':
                self.add_student()
            elif menu_num == '2':
                self.del_student()
            elif menu_num == '3':
                self.update_student()
            elif menu_num == "4":
                self.search_student()
            elif menu_num == '5':
                self.show_all_student()
            elif menu_num == '6':
                self.save_student()
            else:
                break
    @staticmethod
    def show_menu():    # 展示界面方法不涉及参数绑定,因此静态,不涉及对象数据的使用
        print('请选择如下功能:')
        print('1.添加学员')
        print('2.删除学员')
        print('3.修改学员')
        print('4.查询学员')
        print('5.显示所有学员')
        print('6.保存学员信息')
        print('7.退出')

    def add_student(self):
        pass

    def del_student(self):
        pass

    def update_student(self):
        pass

    def search_student(self):
        pass

    def show_all_student(self):
        pass

    def save_student(self):
        pass

    def load_student(self):
        pass

main.py

main.py文件是程序的入口文件,也就是说,运行这个文件,即能启动整个系统,即可以调用系统的方法。

1
2
3
4
5
from managersystem import *
# 只有运行main文件才能执行其中的语句
if __name__ == '__main__':
    student_manager = ManagerSystem()
    student_manager.run()

在系统框架内定义系统功能函数

添加功能

  • 需求:用户输入姓名,性别,手机号,将学员添加到系统。
  • 步骤:
    • 用户输入姓名,性别,手机号;
    • 创建该学员对象;
    • 将该学员对象添加到列表。
  • 代码:
1
2
3
4
5
6
7
    def add_student(self):
        name = input("请输入您的姓名:")
        gender = input("请输入您的性别:")
        tel = input("请输入您的手机:")
        new_student = student(name,gender,tel)
        self.student_list.append(new_student) # 新学生信息对象加入到列表
        print(self.student_list)

删除功能

  • 需求:用户输入目标学员的姓名,如果学员存在则删除该学员。
  • 步骤:
    • 用户输入目标学员姓名
    • 遍历学员数据列表,如果用户输入的学员姓名存在则删除,否则提示该学员不存在。
  • 代码
1
2
3
4
5
6
7
8
9
    def del_student(self):
        del_name = input("请输入删除的学员姓名:")
        for i in self.student_list:
            if del_name == i.name:
                self.student_list.remove(i)
                break
        else:
            print('查无此人')
        print(self.student_list)

修改学员功能

  • 需求:用户输入目标学员姓名,如果学员存在则修改该学员信息。
  • 步骤:
    • 用户输入目标学员姓名
    • 遍历学员数据列表,如果用户输入的学员姓名存在,则修改学员的姓名、性别、手机号数据,否则提示该学员不存在。
  • 代码:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    def update_student(self):
        name = input("请输入需要修改的学员姓名:")
        for i in self.student_list:
            if name == i.name:
                i.name = input("修改姓名为:")
                i.gender = input("修改性别为:")
                i.tel = input("修改手机号为:")
                print(f'修改完成,姓名为:{i.name},性别为:{i.gender},手机为:{i.tel}')
                break
        else:
            print("查无此人")

查询学员

  • 需求:用户输入查询的目标学员姓名,如果学员存在,则显示该学员信息。
  • 步骤:
    • 用户输入目标学员姓名
    • 遍历学员数据列表,输入学员姓名存在则打印,否则提示不存在。
  • 代码:
1
2
3
4
5
6
7
8
    def search_student(self):
        name = input("请输入需要查询的学员姓名:")
        for i in self.student_list:
            if name == i.name:
                print(f'该用户姓名为:{i.name},性别为:{i.gender},手机为:{i.tel}')
                break
        else:
            print('查无此人')

显示所有信息

  • 遍历所有信息列表,打印所有学员信息。
  • 代码:
1
2
3
4
    def show_all_student(self):
        print('姓名\t性别\t手机')
        for i in self.student_list:
            print(f'{i.name}\t{i.gender}\t{i.tel}')

保存学员信息

  • 需求:将修改后的学员数据保存到存储数据的文件中。
  • 步骤:
    • 打开文件
    • 文件写入数据
    • 关闭文件

文件内数据要求的数据类型是字符串,写入的数据不是学员对象的地址,而是写入每个学员的字典值。

  • __dict__是类对象或者实例对象都拥有的属性,收集类对象和实例对象的属性和方法以及对应的值,返回一个字典。
1
2
3
4
5
6
7
8
9
class A(object):
    a = 0
    def __init__(self):
        self.b = 1
aa = A()
print(A.__dict__)
# {'__module__': '__main__', 'a': 0, '__init__': <function A.__init__ at 0x7f9078f111f0>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
print(aa.__dict__)
# {'b': 1}
  • 保存学员信息代码:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
    def save_student(self):
        try:
            f = open('student.data','w')
        except:
            print('读写异常退出')
            return
        else:
            # 写入数据不能为对象,需要把学员数据转化成列表内嵌套字典数据存储。
            new_list = [i.__dict__ for i in self.student_list]
            # 数据变为[{'name':'aa','gender':'male','tel':'123123123'}]
            print(new_list)
            f.write(str(new_list))
        finally:
            f.close()

加载学员信息

  • 需求:每次进入系统后,修改的数据是文件里面的数据
  • 步骤:
    • 尝试以r模式来打开学员数据文件,如果文件不存在则以w模式来打开文件
    • 如果文件存在则读取数据并存储数据
      • 读取数据
      • 转换数据类型为列表并转换为列表内的字典为对象
      • 存储学员数据到学员列表
    • 关闭文件
  • 代码:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    def load_student(self):
        try:
            f = open('student.data','r')
        except:
            f = open('student.data','w')
        else:
            data = f.read()
            new_list = eval(data)
            # 字典转化为对象保存入list缓冲区
            self.student_list = [Student(i['name'],i['gender'],i['tel']) for i in new_list]
        finally:
            f.close()

总结

  • 对每一个功能用到函数进行封装,确定对象来调用函数。
  • 项目中使用面向对象的思想:主要确定了两个角色,系统和学员,并定义为类,其中学员主要用来保存属性,系统用来进行对学员属性数据进行处理。未使用到继承。
  • 数据类型:列表(及列表推导式)、字典、字符串。
  • 文件操作:IO操作写入到异常中,读取和写入的数据类型是字符串类型。