学习了python基础后,来实际操作一下吧!下面是一个学员管理系统:该系统可存储学员信息(包括 姓名、手机号、微信、qq、成绩),存储在txt文件中。系统有四个核心操作
:学员新增,学员删除,学员修改,查看学员,查看学员平均分。
需求分析及设计
1、学员类:该系统中核心对象是学员,那么如何代码中用什么来表示学员呢?可以使用类,来表示所有学员的模板,通过类来实例化各个学员对象
2、学员的存储:学员存储使用普通文件来存储,需要设计存储的格式如下:
1,张三三,15640625127,25564,85955,100
2,李四,12521541445,859966,55226,55
3,王五,12365866555,145255,96
代码中需要两个方法:读文件、写文件
3、核心操作:学员新增、学员修改、学员删除、学员查询
4、和交互台交互
学员类的实现
'''
创建一个学员类 属性包含id,姓名,手机,qq,wx
'''
class Student:def __init__(self,id,name,phone):self.id=idself.name=nameself.phone=phoneself.wx=''self.qq=''self.score=0#当我们直接使用对象时,是对象的内存地址。#当我们想让他按照弄个格式输出时用__str__ 不能在init中返回#也可以自己写一个函数,但是要调用他,__str__不需要调用def __str__(self):return f'{self.id},{self.name},{self.phone},{self.wx},{self.qq},{self.score}'def getId(self):return self.iddef setId(self,id):self.id=iddef getName(self):return self.namedef setName(self,name):self.name=namedef getPhone(self):return self.phonedef setPhone(self,phone):self.phone=phonedef getWx(self):return self.wxdef setWx(self,wx):self.wx=wxdef getQQ(self):return self.qqdef setQQ(self,qq):self.qq=qqdef getScore(self):return self.scoredef setScore(self,score):self.score=scoreif __name__ == '__main__':stu1=Student(1,'张三',15640625127)print(stu1.getName())stu1.setName('李四')print(stu1.getName())stu1.setScore(100)print(stu1.getScore())
文件读写
创建一个txt文件存储学员信息
# 读取和写入数据文件方法
from guanlixitong.student import Student
class FileOperate:def __init__(self):self.filepath = 'E:/PythonWork/0302guanlixitong/guanlixitong/students_db.txt'def read(self):"""读取数据需要转换成{1:stu1,2:stu2,3:stu3,4:stu4} 这样的结构:return:"""stus_dict = {} #读取转成字典,作为中间数据对象with open(file=self.filepath,mode='r',encoding='UTF-8') as f:all_lines = f.readlines() #all_lines是个列表,一个元素代表一行数据,代表一个学员# print(all_lines)for line in all_lines:# line 是'1,张三,18998880001,hhsg,27366,0\n'# 通过逗号分割,再通过索引得到学员的各项信息line_spit = line.split(',')id = line_spit[0]name = line_spit[1]phone = line_spit[2]wx = line_spit[3]qq = line_spit[4]score = line_spit[5][:-1] # '86\n'# print(score)stu = Student(id,name,phone) #实例化学员对象stu.setWx(wx)stu.setQQ(qq)stu.setScore(score)stus_dict[id] = stureturn stus_dictdef write(self,stus_dict:dict): #stus_dict:dict 传入的参数,冒号后边表示这个参数的类型# stus_dict {1:stu1,2:stu2,3:stu3,4:stu4}with open(file=self.filepath,mode='w',encoding='UTF-8') as f:# f.write('学员信息')# 遍历传进来的字典对象里的所有value,for stu in stus_dict.values():# 注意这里的stu是个学员对象f.write(str(stu)) #学员对象不是字符串类型,无法写入的,所以将其转成字符串str(stu),会自动调用学员类中的__str__f.write('\n') #换行
if __name__ == '__main__':stus_dict = FileOperate().read()print(stus_dict)# stus_dict['1'].setName('张三三')# FileOperate().write(stus_dict)
核心操作
from guanlixitong.file_load import FileOperate
from guanlixitong.student import Student
class StuOperate:# 在这里全部使用类属性和类方法完成stus_dict = FileOperate().read()#添加学员# 应该传什么参数呢,学员id?name?phone?# 新增学员是增加一个学员整体对象,所以我们可以传学员对象参数,而不是传某个属性@classmethoddef add_stu(cls,stu:Student):#定义了一个参数stu,他的类型是Student# 操作都是在stus_dict上完成的# 如果学员id已存在不能添加if stu.id not in cls.stus_dict:cls.stus_dict[stu.id] = stu #将传进来的学员对象,加到中间数据对象字典中# 中间变量操作完成后将其重新写入到文件中FileOperate().write(cls.stus_dict)return '添加成功'else:return f'学员id:{stu.id}已存在,不能新增'# 删除学员,你得告诉我要删除谁,# id是可以唯一代表学员的,所以传参id@classmethoddef delete_stu(cls,id):if id in cls.stus_dict:del cls.stus_dict[id]FileOperate().write(cls.stus_dict) #回写文件return '删除成功'else:return f'学员id:{id}不存在,不能删除'# 查询学员# 通过学员id查询,所以传参id@classmethoddef select_stu(cls,id):if id in cls.stus_dict:stu = cls.stus_dict[id]return str(stu)else:return f'学员id:{id}不存在'# 修改学员# 需要告诉我你要修改谁,所以传参id# 你总得告诉我要修改学员的什么信息,name?phone?wx?qq?score# 要修改的信息不确定,并且还有一定的对象关系,name=砂沫沫,phone=162636@classmethoddef change_stu(cls,id,**kwargs):if id in cls.stus_dict:stu = cls.stus_dict[id]# 解析传进来的kwargs,kwargs {'name':'张三','phone'='63267366'}if 'name' in kwargs:stu.setName(kwargs['name'])# stu.name = kwargs['name']if 'phone' in kwargs:stu.setPhone(kwargs['phone'])if 'wx' in kwargs:stu.setWx(kwargs['wx'])if 'qq' in kwargs:stu.setQQ(kwargs['qq'])if 'score' in kwargs:stu.setScore(kwargs['score'])# 修改完成之后也要回写文件FileOperate().write(cls.stus_dict)return '修改成功'else:return f'学员id:{id}不存在'# 在学员系统中增加展示全班学员成绩平均分的方法@classmethoddef show_avg_score(cls):# stus_dict的结构 {1:stu1,2:stu2,3:stu3,4:stu4}# 上述字典中,所有的value都是学员对象,每个学员都有各自的成绩# 平均分的计算规则是总分/学员个数sum = 0for stu in cls.stus_dict.values():score = stu.getScore()#得到学员成绩print(f'score:{score}')sum = sum+int(score)count = len(cls.stus_dict)return sum/countif __name__ == '__main__':# stu = Student('8','哈哈',7832626299)# print(StuOperate.add_stu(stu))# print(StuOperate.select_stu('3'))# StuOperate.change_stu('4',name='哈哈',phone='3555',qq='988776655')StuOperate.delete_stu('7')
学员管理系统控制台

from guanlixitong.stu_operate import StuOperate
from guanlixitong.student import Studentclass Manager:@classmethoddef welcome(cls):print('==========欢迎登录学员管理系统==========')# print('请输入你的操作:新增(1),查询(2),删除(3),修改(4),退出(5)')@classmethoddef operate(cls):try:op = int(input('请输入你的操作:新增(1),查询(2),删除(3),修改(4),退出(5),显示平均分(6)'))except:# print('输入有误,请输入你的操作:新增(1),查询(2),删除(3),修改(4),退出(5)')return #如果输入异常结束函数函数执行if op == 1:# 表示要新增学员id = input('请输入学员id:')name = input('请输入学员姓名:')phone = input('请输入学员手机号:')stu = Student(id,name,phone)print(StuOperate.add_stu(stu))elif op == 2:id = input('请输入要查询的学员id:')print(StuOperate.select_stu(id))elif op == 3:id = input('请输入要删除的学员id:')print(StuOperate.delete_stu(id))elif op == 4:id = input('请输入要修改的学员id:')# 要求控制台输入要修改的信息时,传入字典形式的字符串{'name':'张三','phone'='63267366'}attr_value_dict = input('请输入要修改的信息:')attr_value_dict = eval(attr_value_dict) #可以把字符串形式的字典转成真正的字典print(StuOperate.change_stu(id, **attr_value_dict))elif op == 5:return '退出'elif op == 6:avg_score = StuOperate.show_avg_score()print(f'全班平均分是{avg_score}')@classmethoddef run(cls):cls.welcome()while True:flag = cls.operate()if flag == '退出':print('退出成功')break
if __name__ == '__main__':Manager.run()




![[Java] 学员管理系统(服务器—客户端模式)](https://img-blog.csdnimg.cn/20200331092643419.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JlZ2lubw==,size_16,color_FFFFFF,t_70)











