分析:
- 面向对象编程,要定义类,由类创建对象。类从何而来?分析需求,需求里有哪些事物哪些角色,然后把事物向上抽象成类,然后创建程序文件
- 要创建程序文件,需要先创建一个项目目录Directory,在该目录下创建各个功能的文件,把变量、函数封装成类,把类和属性方法封装成模块,把经常用模块文件封装为包调用
- 要创建一个独立的文件,需要先创建一个工程Project
点击路径,右键,new,Directory
点击项目目录StudentManagerSystem,右键,Python File,
三、书写程序
学员,学员管理系统,要先写哪个呢?
答:因为学员管理系统要对学员进行查改增删,所以要先写学员的代码student.py。要写学员,就要先写类,然后用类创建对象
- 学员信息包含:姓名、性别、⼿机号;(定义实例属性)
- 添加 str 魔法⽅法,⽅便查看学员对象信息
四、书写代码managerSystem.py
需求:
1、存储数据的位置:⽂件(student.data)
- 加载⽂件数据
- 修改数据后保存到⽂件
2、存储数据的形式:列表存储学员对象
3、系统功能
- 添加学员
- 删除学员
- 修改学员
- 查询学员信息
- 显示所有学员信息
- 保存学员信息
要对数据进行操作,首先要把数据从文件读入程序,在程序中把数据保存到变量,通过对变量的各种增删改查实现操作学员,保存数据把数据写入文件,退出系统。
要写管理系统代码,可以先定义一个管理系统类,把要实现的各种功能都封装在这个类中,然后用这个类创建对象
五、管理系统框架
需求:系统功能循环使⽤,⽤户输⼊不同的功能序号执⾏不同的功能。
步骤
1、定义程序⼊⼝函数
- 加载数据
- 显示功能菜单
- ⽤户输⼊功能序号
- 根据⽤户输⼊的功能序号执⾏不同的功能
2、定义系统功能函数,添加、删除学员等
class StudentManager:
def __init__(self):
# 存储数据所有的列表
self.student_list = []
# 一、程序入口函数,启动程序后执行的函数
def run(self):
# 1.加载文件里面的学员数据
while True: # 显示功能界面,用户输入功能序号,根据用户输入执行不同功能都要放在循环里
# 2.显示功能界面
# 3.用户输入功能序号
menu_num = eval(input("请输入需要的功能序号:"))
# 4.根据用户输入的序号执行不同的功能
if menu_num == 1:
# 添加学员
pass
elif menu_num == 2:
# 删除学员
pass
elif menu_num == 3:
# 修改学员信息
pass
elif menu_num == 4:
# 查询学员信息
pass
elif menu_num == 5:
# 显示所有学员信息
pass
elif menu_num == 6:
# 保存学员信息
pass
elif menu_num == 7:
# 退出系统
break
# 二、定义系统功能函数
# 2.1 显示功能菜单函数
# 2.2 添加学员函数
# 2.3 删除学员函数
# 2.4 修改学员信息函数
# 2.5 查询学员信息函数
# 2.6 显示所有学员信息函数
# 2.7 保存学员信息函数
# 2.8 加载学员信息
继续完善,
class StudentManager:
def __init__(self):
# 存储数据所有的列表
self.student_list = []
# 一、程序入口函数,启动程序后执行的函数
def run(self):
# 1.加载文件里面的学员数据
self.load_student()
while True: # 显示功能界面,用户输入功能序号,根据用户输入执行不同功能都要放在循环里
# 2.显示功能界面
self.show_menu() # 在类里面访问方法,self.方法名()
# 3.用户输入功能序号
menu_num = eval(input("请输入需要的功能序号:"))
# 4.根据用户输入的序号执行不同的功能
if menu_num == 1:
# 添加学员
self.add_student()
elif menu_num == 2:
# 删除学员
self.del_student()
elif menu_num == 3:
# 修改学员信息
self.modify_student()
elif menu_num == 4:
# 查询学员信息
self.search_student()
elif menu_num == 5:
# 显示所有学员信息
self.show_student()
elif menu_num == 6:
# 保存学员信息
self.save_student()
elif menu_num == 7:
# 退出系统
break
# 二、定义系统功能函数
# 2.1 显示功能菜单函数--打印序号和对应功能关系,不涉及对象数据--静态方法
@staticmethod
def show_menu():
print("请选择如下功能:")
print("1.添加学员")
print("2.删除学员")
print("3.修改学员信息")
print("4.查询学员信息")
print("5.显示所有学员信息")
print("6.保存学员信息")
print("7.退出系统")
# 2.2 添加学员函数
def add_student(self):
print("添加学员")
# 2.3 删除学员函数
def del_student(self):
print("删除学员")
# 2.4 修改学员信息函数
def modify_student(self):
print("修改学员信息")
# 2.5 查询学员信息函数
def search_student(self):
print("查询学员信息")
# 2.6 显示所有学员信息函数
def show_student(self):
print("显示所有学员信息")
# 2.7 保存学员信息函数
def save_student(self):
print("保存学员信息")
# 2.8 加载学员信息
def load_student(self):
print("加载学员信息")
六、程序入口文件功能实现
入口文件,即运行这个文件就能启动系统。需要用管理系统类创建一个系统对象,然后这个系统对象调用run实例方法
# 1.导入管理系统模块
from managerSystem import *
# 2.启动管理系统
# 保证是当前文件运行才启动管理系统:if--创建对象并调用run实例方法
if __name__ == "__main__":
student_manager = StudentManager()
student_manager.run()
七、定义系统功能函数
1、添加功能
需求:⽤户输⼊学员姓名、性别、⼿机号,将学员添加到系统。
分析步骤,
- ⽤户输⼊姓名、性别、⼿机号
- 创建该学员对象
- 将该学员对象添加到列表
- 用户按保存,将列表元素写入文件
# 2.2 添加学员函数
def add_student(self):
# 1.让用户输入姓名、性别、手机号
name = input("请输入你的姓名:")
gender = input("请输入你的性别:")
tel = input("请输入你的手机号:")
# 2.创建学员对象--类?类在student.py里,故要先导入student模块,再创建对象
student = Student(name, gender, tel)
# 3.将该对象添加到学员列表
self.student_list.append(student) # self.student_list的元素是类Student的对象
# print(self.student_list)
# print(student)
2、删除学员
需求:⽤户输⼊⽬标学员姓名,如果学员存在则删除该学员。
分析步骤
- ⽤户输⼊⽬标学员姓名
- 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则删除,否则则提示该学员不存在。
# 2.3 删除学员函数
def del_student(self):
# 1.用户输入目标学员姓名
del_name = input("请输入要删除的学员姓名:")
# 2.遍历学员列表,如果用户输入的姓名存在则删除学员,否则提示用户不存在
for i in self.student_list: # i是列表元素,即类Student的对象
if del_name == i.name: # self.student_list列表里的元素是类Student创建的,具有类Student的属性和方法
self.student_list.remove(i)
break
else:
print("没有该学员,查无此人")
print(self.student_list)
3、修改学员信息
需求:⽤户输⼊⽬标学员姓名,如果学员存在则修改该学员信息。
分析步骤
- ⽤户输⼊⽬标学员姓名
- 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则修改学员的姓名、性别、⼿机号数据,否则则提示该学员不存在。
# 2.4 修改学员信息函数
def modify_student(self):
# 1.用户输入目标学员姓名
modify_name = input("请输入要修改的学员姓名:")
# 2.遍历列表数据,如果学员存在,修改学员信息;如果不存在,提示学员不存在
for i in self.student_list:
if modify_name == i.name:
i.name = input("姓名:")
i.gender = input("性别:")
i.tel = input("手机号:")
print("修改成功,姓名{},性别{},手机号{}".format(i.name, i.gender, i.tel))
break
else:
print("查无此人")
4、查询学员信息
需求:⽤户输⼊⽬标学员姓名,如果学员存在则打印该学员信息
分析步骤
- ⽤户输⼊⽬标学员姓名
- 遍历学员数据列表,如果⽤户输⼊的学员姓名存在则打印学员信息,否则提示该学员不存
# 2.5 查询学员信息函数
def search_student(self):
# 1.用户输入要查询的学员
search_name = input("请输入要查询的学员姓名:")
# 2.遍历列表,如果学员存在就打印学员信息,否则提示不存在
for i in self.student_list:
if search_name == i.name:
print("姓名是:{},性别是:{},手机号是:{}".format(i.name, i.gender, i.tel))
break
else:
print("查无此人")
5、显示所有学员信息
需求:打印所有学员信息
分析步骤
- 遍历学员数据列表,打印所有学员信息
# 2.6 显示所有学员信息函数
def show_student(self):
# 1.打印表头
print("姓名\t性别\t手机号")
# 2.打印学员信息
for i in self.student_list:
print("{}\t{}\t{}".format(i.name, i.gender, i.tel))
6、保存学员信息
需求:将修改后的学员数据保存到存储数据的⽂件。
分析步骤
- 打开⽂件
- ⽂件写⼊数据
- 关闭⽂件
思考
- ⽂件写⼊的数据是学员对象的内存地址吗?(是对象的属性值)
- ⽂件内数据要求的数据类型是什么?(是字符串)
类.__dict__和对象.__dict__收集类对象或实例对象的属性和方法及对应的值,返回一个字典。
class A:
a = 0 # a是类属性
def __init__(self):
self.b = 1 # b是实例属性
aa = A()
print(A.__dict__) # 返回类内部所有属性和⽅法对应的字典
print(aa.__dict__) # 返回实例的属性和值组成的字典
输出:
{
'__module__': '__main__', 'a': 0, '__init__': <function A.__init__ at 0x0000015A2DB9D3A8>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
{
'b': 1}
# 2.7 保存学员信息函数
def save_student(self):
# 1.打开文件
f = open("student.data", "w")
# 2.文件写入数据
# 2.1将列表里的学员对象转换成字典
new_list = [i.__dict__ for i in self.student_list]
print(new_list)
# 2.2文件写入字符串数据,因文件内数据要求为字符串类型,故需先转换才能写入
f.write(str(new_list))
# 3.关闭文件
f.close()
7、加载学员信息
需求:每次进⼊系统后,修改的数据是⽂件⾥⾯的数据
分析步骤
- 尝试以 “r” 模式打开学员数据⽂件,如果⽂件不存在则以 “w” 模式打开⽂件
- 如果⽂件存在则读取数据并存储数据
– 读取数据
– 转换数据类型为列表,并转换列表内的字典为对象
– 存储学员数据到学员列表 - 关闭⽂件
# 2.8 加载学员信息
def load_student(self):
# 1.打开文件。尝试r打开,如果有异常w
try:
f = open("student.data", "r")
except:
f = open("student.data", "w")
else:
# 2.读取数据。文件读取出的是字符串还原为列表,把[{}]转换为[学员对象]
data = f.read() # data是字符串"[{}]"
new_list = eval(data)
self.student_list = [Student(i["name"], i["gender"], i["tel"]) for i in new_list]
# 3.关闭文件
finally:
f.close()
八、小结
# 1.导入管理系统模块
from managerSystem import *
# 2.启动管理系统
# 保证是当前文件运行才启动管理系统:if--创建对象并调用run实例方法
if __name__ == "__main__":
student_manager = StudentManager()
student_manager.run()
from student import *
class StudentManager:
def __init__(self):
# 存储数据所有的列表
self.student_list = []
# 一、程序入口函数,启动程序后执行的函数
def run(self):
# 1.加载文件里面的学员数据
self.load_student()
while True: # 显示功能界面,用户输入功能序号,根据用户输入执行不同功能都要放在循环里
# 2.显示功能界面
self.show_menu() # 在类里面访问方法,self.方法名()
# 3.用户输入功能序号
menu_num = eval(input("请输入需要的功能序号:"))
# 4.根据用户输入的序号执行不同的功能
if menu_num == 1:
# 添加学员
self.add_student()
elif menu_num == 2:
# 删除学员
self.del_student()
elif menu_num == 3:
# 修改学员信息
self.modify_student()
elif menu_num == 4:
# 查询学员信息
self.search_student()
elif menu_num == 5:
# 显示所有学员信息
self.show_student()
elif menu_num == 6:
# 保存学员信息
self.save_student()
elif menu_num == 7:
# 退出系统
break
# 二、定义系统功能函数
# 2.1 显示功能菜单函数--打印序号和对应功能关系,不涉及对象数据--静态方法
@staticmethod
def show_menu():
print("请选择如下功能:")
print("1.添加学员")
print("2.删除学员")
print("3.修改学员信息")
print("4.查询学员信息")
print("5.显示所有学员信息")
print("6.保存学员信息")
print("7.退出系统")
# 2.2 添加学员函数
def add_student(self):
# 1.让用户输入姓名、性别、手机号
name = input("请输入你的姓名:")
gender = input("请输入你的性别:")
tel = input("请输入你的手机号:")
# 2.创建学员对象--类?类在student.py里,故要先导入student模块,再创建对象
student = Student(name, gender, tel)
# 3.将该对象添加到学员列表
self.student_list.append(student) # self.student_list的元素是类Student的对象
# print(self.student_list)
# print(student)
# 2.3 删除学员函数
def del_student(self):
# 1.用户输入目标学员姓名
del_name = input("请输入要删除的学员姓名:")
# 2.遍历学员列表,如果用户输入的姓名存在则删除学员,否则提示用户不存在
for i in self.student_list: # i是列表元素,即类Student的对象
if del_name == i.name: # self.student_list列表里的元素是类Student创建的,具有类Student的属性和方法
self.student_list.remove(i)
break
else:
print("没有该学员,查无此人")
# print(self.student_list)
# 2.4 修改学员信息函数
def modify_student(self):
# 1.用户输入目标学员姓名
modify_name = input("请输入要修改的学员姓名:")
# 2.遍历列表数据,如果学员存在,修改学员信息;如果不存在,提示学员不存在
for i in self.student_list:
if modify_name == i.name:
i.name = input("姓名:")
i.gender = input("性别:")
i.tel = input("手机号:")
# print("修改成功,姓名{},性别{},手机号{}".format(i.name, i.gender, i.tel))
break
else:
print("查无此人")
# 2.5 查询学员信息函数
def search_student(self):
# 1.用户输入要查询的学员
search_name = input("请输入要查询的学员姓名:")
# 2.遍历列表,如果学员存在就打印学员信息,否则提示不存在
for i in self.student_list:
if search_name == i.name:
print("姓名是:{},性别是:{},手机号是:{}".format(i.name, i.gender, i.tel))
break
else:
print("查无此人")
# 2.6 显示所有学员信息函数
def show_student(self):
# 1.打印表头
print("姓名\t性别\t手机号")
# 2.打印学员信息
for i in self.student_list:
print("{}\t{}\t{}".format(i.name, i.gender, i.tel))
# 2.7 保存学员信息函数
def save_student(self):
# 1.打开文件
f = open("student.data", "a")
# 2.文件写入数据
# 2.1将列表里的学员对象转换成字典
new_list = [i.__dict__ for i in self.student_list]
print(new_list)
# 2.2文件写入字符串数据,因文件内数据要求为字符串类型,故需先转换才能写入
f.write(str(new_list))
# 3.关闭文件
f.close()
# 2.8 加载学员信息
def load_student(self):
# 1.打开文件。尝试r打开,如果有异常w
try:
f = open("student.data", "r")
except:
f = open("student.data", "w")
else:
# 2.读取数据。文件读取出的是字符串还原为列表,把[{}]转换为[学员对象]
data = f.read() # data是字符串"[{}]"
new_list = eval(data)
self.student_list = [Student(i["name"], i["gender"], i["tel"]) for i in new_list]
# 3.关闭文件
finally:
f.close()
class Student:
def __init__(self, name, gender, tel):
self.name = name
self.gender = gender
self.tel = tel
def __str__(self):
return "姓名{},性别{},电话{}".format(self.name, self.gender, self.tel)
PS: source,itheima