用python实现学生管理系统


Posted in Python onJuly 24, 2020

学生管理系统

相信大家学各种语言的时候,练习总是会写各种管理系统吧,管理系统主要有对数据的增删查改操作,原理不难,适合作为练手的小程序

数据的结构

要保存数据就需要数据结构,比如c里面的结构体啊,python里面的列表,字典,还有类都是常用的数据类型
在这里,我使用了链表来作为学生数据的数据结构,
即 Node类 和 Student_LinkList类,来实现链表

数据的持久化

我们在程序中产生的数据是保存在内存中的,程序一旦退出,下次就不能恢复此次的数据了,因此需要把内存种的数据,保存到文件或数据库中,存储起来,这个过程就叫数据的持久化

本程序使用了python标准库pickle提供的序列化方法dump()和load()来实现数据的持久化

配置文件

使用配置文件,可以方便程序中使用不同的子类实现,

本程序使用configparser来对配置文件解析
本程序配置文件名为 Student.ini

#Student.ini文件
[Student]
student = Student_LinkList

[Persistence]
persistence = Persistence_Pickle
file = student.pik

类之间的关系

Student #和学生数据有关的抽象类
±- Student_LinkList
Persistence #和持久化有关的抽象类
±- Persistence_Pickle
MyConfigure #和配置文件读取有关的类
UI #和交互有关的父类
±- Cmd_UI

界面预览

用python实现学生管理系统

源码

'''
使用单链表实现的学生管理系统
'''
import pickle
import abc
import configparser

class Student(abc.ABC):
 '''
 抽象学生类
 '''
 @abc.abstractmethod
 def add(self):
 '''
 增加学生结点
 '''
 pass

 @abc.abstractmethod
 def ladd(self):
 '''
 从左侧增加学生结点
 '''
 pass

 @abc.abstractmethod
 def delete(self,id_):
 '''
 根据id值来删除一个结点
 '''
 pass

 @abc.abstractmethod
 def delete_name(self,name):
 '''
 根据姓名来删除一个结点
 '''
 pass

 @abc.abstractmethod
 def insert(self,idx,val):
 '''
 插入到指定的位置
 '''
 pass

 @abc.abstractmethod
 def show(self):
 '''
 显示所有的学生结点
 '''
 pass

 @abc.abstractmethod
 def search_id(self):
 '''
 根据id查询节点
 '''
 pass

 @abc.abstractmethod
 def search_name(self):
 '''
 根据name查询节点
 '''

 @abc.abstractmethod
 def modity_id(self):
 '''
 根据id找到节点,然后修改
 '''
 pass



class Node(object):
 '''
 学生链表结点
 '''
 def __init__(self,id_: int,name: str,sex: str,age: int,score: int):
 self.id = id_
 self.name = name
 self.sex = sex
 self.age = age
 self.score = score

 self.next = None

 def modity(self,id_,name,sex,age,score):
 '''
 修改
 '''
 self.id = id_
 self.name = name
 self.sex = sex
 self.age = age
 self.score = score


 def __str__(self):
 '''
 用于显示输出
 '''
 return f"[学生:{self.id:^2}]-->name:{self.name:^10}sex:{self.sex:^10}age:{self.age:^10}score:{self.score:^10}"

class Student_LinkList(Student):
 '''
 学生链表
 '''
 def __init__(self):
 self.head = Node(-1,'head','-1',-1,-1)
 self.length = 0
 self.tail = self.head #尾部结点用于尾插

 def add(self,id_,name,sex,age,score):
 '''
 添加一个学生结点,尾插
 '''
 #print('当前tail的值',self.tail)
 temp = Node(id_,name,sex,age,score)
 self.tail.next = temp 
 self.tail = self.tail.next

 self.length += 1
 print('[info]:添加成功')

 def ladd(self,id_,name,sex,age,score):
 '''
 添加一个学生,头插
 '''
 temp = Node(id_,name,sex,age,score)
 temp.next = self.head.next
 self.head.next = temp

 if self.tail == self.head:
  self.tail = temp

 self.length += 1
 print('[info]:添加成功')

 def delete(self,id_):
 '''
 根据id值来删除一个结点,用迭代实现
 '''
 p = self.head
 while p.next != None and p.next.id != id_:
  p = p.next

 if p.next == None:
  print('[error]:找不到id')
  return -1
 else:
  temp = p.next
  p.next = temp.next
  #如果删除的是尾结点,还要移动tail
  if temp.next == None:
  self.tail = p
  del temp
 print('[info]:删除成功')

 def delete_name(self,name):
 '''
 根据姓名来删除一个结点,用递归实现
 '''
 def _func(node: Node,name: str):
  '''
  递归函数
  '''
  #到了尾巴节点了,还没有找到
  if node.next == None:
  print('[info]:找不到name')
  return False
  elif node.next.name == name:
  temp = node.next
  node.next = temp.next
  #如果删除的是尾结点,还要移动tail
  if temp.next == None:
   self.tail = node
  del temp
  print('[info]:删除成功')
  return True
  else:
  return _func(node.next,name)

 t = self.head
 return _func(t,name)

 def insert(self,idx,id_,name,sex,age,score):
 '''
 在指定位置插入数据
 '''
 if idx > self.length or idx == 0:
  print(f'[error]:你输入的索引非法(1-{self.length})')
  return 0
 p,cur = self.head,0
 while p != None and cur < idx-1:
  p = p.next

 if cur < idx-1:
  return -1
 else:
  temp = Node(id_,name,sex,age,score)
  temp.next = p.next
  p.next = temp
  return True
 print('[info]:插入成功')

 def search_id(self,id_):
 '''
 根据id查询节点
 '''
 p = self.head
 while p != None and p.id != id_:
  p = p.next
 if p == None:
  return -1
 else:
  return p

 def search_name(self,name):
 '''
 根据name查询节点
 '''
 p = self.head
 
 def _func(node: Node,name: str):
  '''
  递归函数
  '''
  if node == None:
  return -1
  elif node.name == name:
  return node
  return _func(node.next,name)

 return _func(p,name)

 def modity_id(self,id0,id_,name,sex,age,score):
 '''
 根据id找到节点,然后修改
 '''
 node = self.search_id(id0)
 if node == -1:
  print('[error]:找不到该id')
  return -1
 else:
  node.modity(id_,name,sex,age,score)


 def show(self):
 '''
 显示所有的学生结点,迭代
 '''
 print(f'\n{"-"*25}以下是系统内数据{"-"*25}')
 temp = []
 p = self.head
 while p != None:
  temp.append(p)
  p = p.next
 return temp

class Student_Array():
 '''
 用数组实现学生数据存储
 '''
 pass

class Student_Queue():
 '''
 用队列实现
 '''
 pass

class Student_Dict():
 '''
 用队列实现
 '''
 pass

class Persistence(abc.ABC):
 '''
 链表数据的持久化
 '''
 @abc.abstractmethod
 def save(self):
 '''
 把对象保存
 '''
 pass

 @abc.abstractmethod
 def load(self):
 '''
 加载对象
 '''
 pass

class Persistence_Pickle(Persistence):
 '''
 使用pickle来序列化
 '''
 def __init__(self,cls: Student,file_):
 self.filename = file_
 self.obj = None
 self.cls = cls

 def save(self):
 with open(self.filename,'wb') as f:
  pickle.dump(self.obj,f)

 def load(self):
 try:
  with open(self.filename,'rb') as f:
  temp = pickle.load(f)
 except:
  temp = globals()[self.cls]()
 print('返回temp:',type(temp))
 self.obj = temp
 return temp

class Persistence_File(Persistence):
 '''
 使用文件来持久化
 '''
 pass

class Persistence_Mysql(Persistence):
 '''
 使用Mysql数据库来持久化
 '''
 pass

class Persistence_Socket(Persistence):
 '''
 使用远程套接字持久化
 '''
 pass

class MyConfigure(object):
 '''
 用来读取配置文件的类
 '''
 def __init__(self):
 self.config = configparser.ConfigParser()

 def save(self):
 '''
 保存配置文件
 '''
 with open('Student.ini','w') as f:
  self.config.write(f)

 def load(self):
 '''
 加载配置文件
 '''
 self.config.read('Student.ini')

 def get_student_class(self):
 '''
 获得Student该使用哪个子类
 '''
 return self.config['Student']['student']

 def get_persistence_class(self):
 '''
 获得持久化,该使用那个类,
 如果是Pickle或文件,还有file作为保存的文件名
 '''
 temp = {}
 temp['persistence'] = self.config['Persistence']['persistence']
 if 'Persistence_Pickle' in temp['persistence']:
  temp['file'] = self.config['Persistence']['file']
 return temp

class UI(object):
 '''
 界面交互
 '''
 def __init__(self):
 self.config = MyConfigure()
 self.config.load()
 s_class = self.config.get_student_class()
 p_class = self.config.get_persistence_class()

 self.persistence = globals()[p_class['persistence']](s_class,p_class['file'])
 self.student = self.persistence.load()
 print('实例化成功:',self.student,self.persistence)

 def save(self):
 '''
 把数据保存
 '''
 self.persistence.save()

 def quit(self):
 '''
 退出:先保存配置,然后退出
 '''
 self.config.save()
 self.save()

 def _show(self):
 '''
 显示所有学生节点
 '''
 return self.student.show()


 def _add(self,direction,*temp):
 '''
 增加学生结点,
 direction 1左添加,2右添加
 '''
 if direction == 1:
  self.student.ladd(*temp)
 elif direction == 2:
  self.student.add(*temp)

 def _delete(self,attribute: int,val: str):
 '''
 删除学生节点
 attribute: 需要根据哪个属性删除,1.id 或 2.name
 '''
 if attribute == 1:
  self.student.delete(val)
 elif attribute == 2:
  self.student.delete_name(val)

 def _insert(self,idx,*temp):
 '''
 把学生节点插入到指定的位置
 '''
 self.student.insert(idx,*temp)

 def _search(self,attribute,val):
 '''
 查询
 '''
 if attribute == 1:
  return self.student.search_id(val)
 elif attribute == 2:
  return self.student.search_name(val)

 def _modity(self,attribute,id_,*temp):
 '''
 修改
 '''
 if attribute == 1:
  self.student.modity_id(id_,*temp)
 elif attribute == 2:
  print('[info]:因为没实现,所以什么也不做')
  pass #根据name修改没有写




class Cmd_UI(UI):
 '''
 命令行的交互界面
 '''
 def __init__(self):
 super(Cmd_UI,self).__init__()

 def get_input_1_2(self,info: str):
 '''
 获得输入,返回1或者2
 info: 描述输入的信息
 '''
 x = None
 while x == None:
  temp = input(info)
  if temp == '1':
  x = 1
  elif temp == '2':
  x = 2
  else:
  print('你只能输入1或者2')
 return x

 def get_input_arg(self):
 '''
 获得用户的输入构造学生节点
 '''
 id_ = input('请输入id')
 name = input('请输入姓名')
 sex = input('请输入性别')
 age = input('请输入年龄')
 score = input('请输入成绩')
 return (id_,name,sex,age,score)

 def delete(self):
 '''
 删除节点
 '''
 info = '你想要根据哪个属性删除节点:1.id 2.name'
 attribute = self.get_input_1_2(info)
 val = input('输入你想要删除的值:')
 self._delete(attribute,val)

 def show(self):
 '''
 显示
 '''
 rel = self._show()
 for i in rel:
  print(i)

 def add(self):
 '''
 增加学生结点
 '''
 info = '你想要插入的位置:1.左边 2.右边'
 direction = self.get_input_1_2(info)
 arg = self.get_input_arg()
 self._add(direction,*arg)

 def insert(self):
 '''
 新学生,插入到指定的位置
 '''
 idx = int(input('输入要插入的位置'))
 temp = self.get_input_arg()
 self._insert(idx,*temp)

 def search(self):
 '''
 查询学生
 '''
 info = '你想要根据哪个属性搜索节点:1.id 2.name'
 attribute = self.get_input_1_2(info)
 val = input('输入你想要查询的值:')

 print(self._search(attribute,val))

 def modity(self):
 '''
 修改学生信息
 '''
 info = '你想要根据哪个属性搜索节点:1.id 2.name'
 attribute = self.get_input_1_2(info)
 val_ = input('输入要查询的值:')
 temp = self.get_input_arg()
 self._modity(attribute,val_,*temp)

 def main(self):
 '''
 主流程
 '''
 info = '''
 *******************
 *kalpa学生管理系统*
 * 0.显示数据 *
 * 1.增加数据 *
 * 2.删除数据 *
 * 3.查询数据 *
 * 4.修改数据 *
 * 5.保存并退出 *
 *******************
 '''
 print(info)
 a = '0'
 while a in ['0','1','2','3','4','5']:
  if a == '0':
  self.show()
  elif a == '1':
  self.add()
  elif a == '2':
  self.delete()
  elif a == '3':
  self.search()
  elif a == '4':
  self.modity()
  elif a == '5':
  self.quit()
  return
  a = input('>>')


if __name__ == "__main__":
 ui = Cmd_UI()
 ui.main()

关于管理系统的更多内容请点击《管理系统专题》进行学习

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 获取新浪微博的最新公共微博实例分享
Jul 03 Python
把MySQL表结构映射为Python中的对象的教程
Apr 07 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
Python装饰器实现几类验证功能做法实例
May 18 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
python解析xml简单示例
Jun 21 Python
python 缺失值处理的方法(Imputation)
Jul 02 Python
在pandas中遍历DataFrame行的实现方法
Oct 23 Python
python 实现屏幕录制示例
Dec 23 Python
Python imutils 填充图片周边为黑色的实现
Jan 19 Python
pycharm激活码快速激活及使用步骤
Mar 12 Python
Django实现将一个字典传到前端显示出来
Apr 03 Python
Python 解析简单的XML数据
Jul 24 #Python
深入了解NumPy 高级索引
Jul 24 #Python
python实现学生管理系统开发
Jul 24 #Python
浅析Python 多行匹配模式
Jul 24 #Python
Python图像处理二值化方法实例汇总
Jul 24 #Python
Python如何合并多个字典或映射
Jul 24 #Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 #Python
You might like
PHP如何编写易读的代码
2007/07/10 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
PHP下打开URL地址的几种方法小结
2010/05/16 PHP
PHP设计模式之迭代器模式的深入解析
2013/06/13 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
Javascript学习笔记2 函数
2010/01/11 Javascript
jquery ajax执行后台方法
2010/03/18 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
如何基于vue-cli3.0构建功能完善的移动端架子
2019/04/24 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python实现拼接多张图片的方法
2014/12/01 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
Python在线运行代码助手
2016/07/15 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
pandas按若干个列的组合条件筛选数据的方法
2018/04/11 Python
Python对数据进行插值和下采样的方法
2018/07/03 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
python os.rename实例用法详解
2020/12/06 Python
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
护理专业自荐书
2014/06/04 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
助人为乐好少年事迹材料
2014/08/18 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
公路施工安全责任书
2015/05/08 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python