• 售前

  • 售后

热门帖子
入门百科

python实现简朴的弟子管理体系

[复制链接]
海鑫木业 显示全部楼层 发表于 2021-10-25 19:40:30 |阅读模式 打印 上一主题 下一主题
本文实例为大家分享了python实现简单学生管理体系的具体代码,供大家参考,具体内容如下
学生管理体系
信任大家学各种语言的时间,练习总是会写各种管理体系吧,管理体系重要有对数据的增删查改操作,原理不难,适合作为练手的小步调
数据的结构
要保存数据就必要数据结构,好比c内里的结构体啊,python内里的列表,字典,尚有类都是常用的数据类型
在这里,我利用了链表来作为学生数据的数据结构,
即 Node类 和 Student_LinkList类,来实现链表
数据的长期化
我们在步调中产生的数据是保存在内存中的,步调一旦退出,下次就不能规复此次的数据了,因此必要把内存种的数据,保存到文件或数据库中,存储起来,这个过程就叫数据的长期化
本步调利用了python标准库pickle提供的序列化方法dump()和load()来实现数据的长期化
设置文件
利用设置文件,可以方便步调中利用差异的子类实现,
本步调利用configparser来对设置文件分析
本步调设置文件名为 Student.ini
  1. #Student.ini文件
  2. [Student]
  3. student = Student_LinkList
  4. [Persistence]
  5. persistence = Persistence_Pickle
  6. file = student.pik
复制代码
类之间的关系
Student #和学生数据有关的抽象类
±- Student_LinkList
Persistence #和长期化有关的抽象类
±- Persistence_Pickle
MyConfigure #和设置文件读取有关的类
UI #和交互有关的父类
±- Cmd_UI
界面预览

源码
  1. '''
  2. 使用单链表实现的学生管理系统
  3. '''
  4. import pickle
  5. import abc
  6. import configparser
  7. class Student(abc.ABC):
  8.   '''
  9.   抽象学生类
  10.   '''
  11.   @abc.abstractmethod
  12.   def add(self):
  13.     '''
  14.     增加学生结点
  15.     '''
  16.     pass
  17.   @abc.abstractmethod
  18.   def ladd(self):
  19.     '''
  20.     从左侧增加学生结点
  21.     '''
  22.     pass
  23.   @abc.abstractmethod
  24.   def delete(self,id_):
  25.     '''
  26.     根据id值来删除一个结点
  27.     '''
  28.     pass
  29.   @abc.abstractmethod
  30.   def delete_name(self,name):
  31.     '''
  32.     根据姓名来删除一个结点
  33.     '''
  34.     pass
  35.   @abc.abstractmethod
  36.   def insert(self,idx,val):
  37.     '''
  38.     插入到指定的位置
  39.     '''
  40.     pass
  41.   @abc.abstractmethod
  42.   def show(self):
  43.     '''
  44.     显示所有的学生结点
  45.     '''
  46.     pass
  47.   @abc.abstractmethod
  48.   def search_id(self):
  49.     '''
  50.     根据id查询节点
  51.     '''
  52.     pass
  53.   @abc.abstractmethod
  54.   def search_name(self):
  55.     '''
  56.     根据name查询节点
  57.     '''
  58.   @abc.abstractmethod
  59.   def modity_id(self):
  60.     '''
  61.     根据id找到节点,然后修改
  62.     '''
  63.     pass
  64. class Node(object):
  65.   '''
  66.   学生链表结点
  67.   '''
  68.   def __init__(self,id_: int,name: str,sex: str,age: int,score: int):
  69.     self.id = id_
  70.     self.name = name
  71.     self.sex = sex
  72.     self.age = age
  73.     self.score = score
  74.     self.next = None
  75.   def modity(self,id_,name,sex,age,score):
  76.     '''
  77.     修改
  78.     '''
  79.     self.id = id_
  80.     self.name = name
  81.     self.sex = sex
  82.     self.age = age
  83.     self.score = score
  84.   def __str__(self):
  85.     '''
  86.     用于显示输出
  87.     '''
  88.     return f"[学生:{self.id:^2}]-->name:{self.name:^10}sex:{self.sex:^10}age:{self.age:^10}score:{self.score:^10}"
  89. class Student_LinkList(Student):
  90.   '''
  91.   学生链表
  92.   '''
  93.   def __init__(self):
  94.     self.head = Node(-1,'head','-1',-1,-1)
  95.     self.length = 0
  96.     self.tail = self.head #尾部结点用于尾插
  97.   def add(self,id_,name,sex,age,score):
  98.     '''
  99.     添加一个学生结点,尾插
  100.     '''
  101.     #print('当前tail的值',self.tail)
  102.     temp = Node(id_,name,sex,age,score)
  103.     self.tail.next = temp
  104.     self.tail = self.tail.next
  105.     self.length += 1
  106.     print('[info]:添加成功')
  107.   def ladd(self,id_,name,sex,age,score):
  108.     '''
  109.     添加一个学生,头插
  110.     '''
  111.     temp = Node(id_,name,sex,age,score)
  112.     temp.next = self.head.next
  113.     self.head.next = temp
  114.     if self.tail == self.head:
  115.       self.tail = temp
  116.     self.length += 1
  117.     print('[info]:添加成功')
  118.   def delete(self,id_):
  119.     '''
  120.     根据id值来删除一个结点,用迭代实现
  121.     '''
  122.     p = self.head
  123.     while p.next != None and p.next.id != id_:
  124.       p = p.next
  125.     if p.next == None:
  126.       print('[error]:找不到id')
  127.       return -1
  128.     else:
  129.       temp = p.next
  130.       p.next = temp.next
  131.       #如果删除的是尾结点,还要移动tail
  132.       if temp.next == None:
  133.         self.tail = p
  134.       del temp
  135.     print('[info]:删除成功')
  136.   def delete_name(self,name):
  137.     '''
  138.     根据姓名来删除一个结点,用递归实现
  139.     '''
  140.     def _func(node: Node,name: str):
  141.       '''
  142.       递归函数
  143.       '''
  144.       #到了尾巴节点了,还没有找到
  145.       if node.next == None:
  146.         print('[info]:找不到name')
  147.         return False
  148.       elif node.next.name == name:
  149.         temp = node.next
  150.         node.next = temp.next
  151.         #如果删除的是尾结点,还要移动tail
  152.         if temp.next == None:
  153.           self.tail = node
  154.         del temp
  155.         print('[info]:删除成功')
  156.         return True
  157.       else:
  158.         return _func(node.next,name)
  159.     t = self.head
  160.     return _func(t,name)
  161.   def insert(self,idx,id_,name,sex,age,score):
  162.     '''
  163.     在指定位置插入数据
  164.     '''
  165.     if idx > self.length or idx == 0:
  166.       print(f'[error]:你输入的索引非法(1-{self.length})')
  167.       return 0
  168.     p,cur = self.head,0
  169.     while p != None and cur < idx-1:
  170.       p = p.next
  171.     if cur < idx-1:
  172.       return -1
  173.     else:
  174.       temp = Node(id_,name,sex,age,score)
  175.       temp.next = p.next
  176.       p.next = temp
  177.       return True
  178.     print('[info]:插入成功')
  179.   def search_id(self,id_):
  180.     '''
  181.     根据id查询节点
  182.     '''
  183.     p = self.head
  184.     while p != None and p.id != id_:
  185.       p = p.next
  186.     if p == None:
  187.       return -1
  188.     else:
  189.       return p
  190.   def search_name(self,name):
  191.     '''
  192.     根据name查询节点
  193.     '''
  194.     p = self.head
  195.    
  196.     def _func(node: Node,name: str):
  197.       '''
  198.       递归函数
  199.       '''
  200.       if node == None:
  201.         return -1
  202.       elif node.name == name:
  203.         return node
  204.       return _func(node.next,name)
  205.     return _func(p,name)
  206.   def modity_id(self,id0,id_,name,sex,age,score):
  207.     '''
  208.     根据id找到节点,然后修改
  209.     '''
  210.     node = self.search_id(id0)
  211.     if node == -1:
  212.       print('[error]:找不到该id')
  213.       return -1
  214.     else:
  215.       node.modity(id_,name,sex,age,score)
  216.   def show(self):
  217.     '''
  218.     显示所有的学生结点,迭代
  219.     '''
  220.     print(f'\n{"-"*25}以下是系统内数据{"-"*25}')
  221.     temp = []
  222.     p = self.head
  223.     while p != None:
  224.       temp.append(p)
  225.       p = p.next
  226.     return temp
  227. class Student_Array():
  228.   '''
  229.   用数组实现学生数据存储
  230.   '''
  231.   pass
  232. class Student_Queue():
  233.   '''
  234.   用队列实现
  235.   '''
  236.   pass
  237. class Student_Dict():
  238.   '''
  239.   用队列实现
  240.   '''
  241.   pass
  242. class Persistence(abc.ABC):
  243.   '''
  244.   链表数据的持久化
  245.   '''
  246.   @abc.abstractmethod
  247.   def save(self):
  248.     '''
  249.     把对象保存
  250.     '''
  251.     pass
  252.   @abc.abstractmethod
  253.   def load(self):
  254.     '''
  255.     加载对象
  256.     '''
  257.     pass
  258. class Persistence_Pickle(Persistence):
  259.   '''
  260.   使用pickle来序列化
  261.   '''
  262.   def __init__(self,cls: Student,file_):
  263.     self.filename = file_
  264.     self.obj = None
  265.     self.cls = cls
  266.   def save(self):
  267.     with open(self.filename,'wb') as f:
  268.       pickle.dump(self.obj,f)
  269.   def load(self):
  270.     try:
  271.       with open(self.filename,'rb') as f:
  272.         temp = pickle.load(f)
  273.     except:
  274.       temp = globals()[self.cls]()
  275.     print('返回temp:',type(temp))
  276.     self.obj = temp
  277.     return temp
  278. class Persistence_File(Persistence):
  279.   '''
  280.   使用文件来持久化
  281.   '''
  282.   pass
  283. class Persistence_Mysql(Persistence):
  284.   '''
  285.   使用Mysql数据库来持久化
  286.   '''
  287.   pass
  288. class Persistence_Socket(Persistence):
  289.   '''
  290.   使用远程套接字持久化
  291.   '''
  292.   pass
  293. class MyConfigure(object):
  294.   '''
  295.   用来读取配置文件的类
  296.   '''
  297.   def __init__(self):
  298.     self.config = configparser.ConfigParser()
  299.   def save(self):
  300.     '''
  301.     保存配置文件
  302.     '''
  303.     with open('Student.ini','w') as f:
  304.       self.config.write(f)
  305.   def load(self):
  306.     '''
  307.     加载配置文件
  308.     '''
  309.     self.config.read('Student.ini')
  310.   def get_student_class(self):
  311.     '''
  312.     获得Student该使用哪个子类
  313.     '''
  314.     return self.config['Student']['student']
  315.   def get_persistence_class(self):
  316.     '''
  317.     获得持久化,该使用那个类,
  318.     如果是Pickle或文件,还有file作为保存的文件名
  319.     '''
  320.     temp = {}
  321.     temp['persistence'] = self.config['Persistence']['persistence']
  322.     if 'Persistence_Pickle' in temp['persistence']:
  323.       temp['file'] = self.config['Persistence']['file']
  324.     return temp
  325. class UI(object):
  326.   '''
  327.   界面交互
  328.   '''
  329.   def __init__(self):
  330.     self.config = MyConfigure()
  331.     self.config.load()
  332.     s_class = self.config.get_student_class()
  333.     p_class = self.config.get_persistence_class()
  334.     self.persistence = globals()[p_class['persistence']](s_class,p_class['file'])
  335.     self.student = self.persistence.load()
  336.     print('实例化成功:',self.student,self.persistence)
  337.   def save(self):
  338.     '''
  339.     把数据保存
  340.     '''
  341.     self.persistence.save()
  342.   def quit(self):
  343.     '''
  344.     退出:先保存配置,然后退出
  345.     '''
  346.     self.config.save()
  347.     self.save()
  348.   def _show(self):
  349.     '''
  350.     显示所有学生节点
  351.     '''
  352.     return self.student.show()
  353.   def _add(self,direction,*temp):
  354.     '''
  355.     增加学生结点,
  356.     direction 1左添加,2右添加
  357.     '''
  358.     if direction == 1:
  359.       self.student.ladd(*temp)
  360.     elif direction == 2:
  361.       self.student.add(*temp)
  362.   def _delete(self,attribute: int,val: str):
  363.     '''
  364.     删除学生节点
  365.     attribute: 需要根据哪个属性删除,1.id 或 2.name
  366.     '''
  367.     if attribute == 1:
  368.       self.student.delete(val)
  369.     elif attribute == 2:
  370.       self.student.delete_name(val)
  371.   def _insert(self,idx,*temp):
  372.     '''
  373.     把学生节点插入到指定的位置
  374.     '''
  375.     self.student.insert(idx,*temp)
  376.   def _search(self,attribute,val):
  377.     '''
  378.     查询
  379.     '''
  380.     if attribute == 1:
  381.       return self.student.search_id(val)
  382.     elif attribute == 2:
  383.       return self.student.search_name(val)
  384.   def _modity(self,attribute,id_,*temp):
  385.     '''
  386.     修改
  387.     '''
  388.     if attribute == 1:
  389.       self.student.modity_id(id_,*temp)
  390.     elif attribute == 2:
  391.       print('[info]:因为没实现,所以什么也不做')
  392.       pass #根据name修改没有写
  393. class Cmd_UI(UI):
  394.   '''
  395.   命令行的交互界面
  396.   '''
  397.   def __init__(self):
  398.     super(Cmd_UI,self).__init__()
  399.   def get_input_1_2(self,info: str):
  400.     '''
  401.     获得输入,返回1或者2
  402.     info: 描述输入的信息
  403.     '''
  404.     x = None
  405.     while x == None:
  406.       temp = input(info)
  407.       if temp == '1':
  408.         x = 1
  409.       elif temp == '2':
  410.         x = 2
  411.       else:
  412.         print('你只能输入1或者2')
  413.     return x
  414.   def get_input_arg(self):
  415.     '''
  416.     获得用户的输入构造学生节点
  417.     '''
  418.     id_ = input('请输入id')
  419.     name = input('请输入姓名')
  420.     sex = input('请输入性别')
  421.     age = input('请输入年龄')
  422.     score = input('请输入成绩')
  423.     return (id_,name,sex,age,score)
  424.   def delete(self):
  425.     '''
  426.     删除节点
  427.     '''
  428.     info = '你想要根据哪个属性删除节点:1.id 2.name'
  429.     attribute = self.get_input_1_2(info)
  430.     val = input('输入你想要删除的值:')
  431.     self._delete(attribute,val)
  432.   def show(self):
  433.     '''
  434.     显示
  435.     '''
  436.     rel = self._show()
  437.     for i in rel:
  438.       print(i)
  439.   def add(self):
  440.     '''
  441.     增加学生结点
  442.     '''
  443.     info = '你想要插入的位置:1.左边 2.右边'
  444.     direction = self.get_input_1_2(info)
  445.     arg = self.get_input_arg()
  446.     self._add(direction,*arg)
  447.   def insert(self):
  448.     '''
  449.     新学生,插入到指定的位置
  450.     '''
  451.     idx = int(input('输入要插入的位置'))
  452.     temp = self.get_input_arg()
  453.     self._insert(idx,*temp)
  454.   def search(self):
  455.     '''
  456.     查询学生
  457.     '''
  458.     info = '你想要根据哪个属性搜索节点:1.id 2.name'
  459.     attribute = self.get_input_1_2(info)
  460.     val = input('输入你想要查询的值:')
  461.     print(self._search(attribute,val))
  462.   def modity(self):
  463.     '''
  464.     修改学生信息
  465.     '''
  466.     info = '你想要根据哪个属性搜索节点:1.id 2.name'
  467.     attribute = self.get_input_1_2(info)
  468.     val_ = input('输入要查询的值:')
  469.     temp = self.get_input_arg()
  470.     self._modity(attribute,val_,*temp)
  471.   def main(self):
  472.     '''
  473.     主流程
  474.     '''
  475.     info = '''
  476.     *******************
  477.     *kalpa学生管理系统*
  478.     *  0.显示数据  *
  479.     *  1.增加数据  *
  480.     *  2.删除数据  *
  481.     *  3.查询数据  *
  482.     *  4.修改数据  *
  483.     *  5.保存并退出 *
  484.     *******************
  485.     '''
  486.     print(info)
  487.     a = '0'
  488.     while a in ['0','1','2','3','4','5']:
  489.       if a == '0':
  490.         self.show()
  491.       elif a == '1':
  492.         self.add()
  493.       elif a == '2':
  494.         self.delete()
  495.       elif a == '3':
  496.         self.search()
  497.       elif a == '4':
  498.         self.modity()
  499.       elif a == '5':
  500.         self.quit()
  501.         return
  502.       a = input('>>')
  503. if __name__ == "__main__":
  504.   ui = Cmd_UI()
  505.   ui.main()
复制代码
以上就是本文的全部内容,渴望对大家的学习有所资助,也渴望大家多多支持脚本之家。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作