import os import pickle import sys #写一个学生和管理员共同的属性 class Person(): # 创建选择课程方法,使其在后面可以进行保存直接调用 def get_course(self): with open("course_info","rb") as f: while 1: try: course_obj = pickle.load(f) yield course_obj except: break def show_course(self): print("可选课程:") courses = self.get_course() for num,course_obj in enumerate(courses,1): print(num,course_obj.name,course_obj.price,course_obj.teacher) # 退出方法,使用系统退出 def exit(self): print("exit") sys.exit() # 创建一个得到学生的函数,下面调用,减少重复 def get_student(self): with open("student_info","rb") as f: while 1: try: stu_obj = pickle.load(f) return stu_obj except: break # 创建学生类,并设置相对应的属性 """ 1、查看所有课程 2、选择课程 3、查看所选课程 4、退出程序 """ class Student(Person): operate_list = ["show_course","select_course","show_selected_course","exit"] def __init__(self,name): self.name = name self.courses = [] def select_course(self): print("可选课程如下:") self.show_course() inp = int(input("请输入课程序号:")) course_itr = self.get_course() for i in range(inp): course_obj = next(course_itr) self.courses.append(course_obj) print("选课成功") def show_selected_course(self): print("已选课程如下:") for num,course_obj in enumerate(self.courses,1): print(num,course_obj.name,course_obj.price,course_obj.teacher) # 退出方法要实时更新,进来后先判断,如果已经操作过,进行信息更新 def exit(self): with open("student_info_new","wb") as f2: while 1: try: stu_obj = self.get_student() if stu_obj.name == self.name: pickle.dump(self,f2) else: pickle.dump(stu_obj) except: break os.remove("student_info") os.rename("student_info_new","student_info") super().exit() @classmethod def get_obj(cls,name): cls.get_student() # 创建管理员类,并设置相对应的属性 """ 1、创建课程 2、创建学生学生账号 3、查看所有课程 4、查看所有学生 5、查看所有学生的选课情况 6、退出程序 """ class Manager(Person): operate_list = ["creat_course", "creat_student","show_course", "show_student", "show_student_course","exit"] def __init__(self,name): self.name = name def creat_course(self): course_name = input("课程名称:") course_price = int(input("课程价格:")) teacher = input("授课老师:") course_obj = Course(course_name,course_price,teacher) with open("course_info","ab") as f: #将实例化的对象保存到文件,不能保存到内存,运行一次就没有了 pickle.dump(course_obj,f) print("\33[0;35m课程创建成功\33[0m") def creat_student(self): student_name = input("学生账号:") student_pwd = input("学生密码:") with open("userinfo","a") as f: #将创建的学生信息保存到文件中 f.write(f"{student_name}|{student_pwd}|{'Student'}\n") stu_obj = Student(student_name) #创建学生对象 with open("student_info","ab") as f: #将实例化的对象保存到文件,不能保存到内存,运行一次就没有了 pickle.dump(stu_obj,f) print("\33[0;31m学生账号创建成功\33[0m") def show_student(self): print("学生如下:") self.get_student() num = 0 while 1: try: num += 1 print(num,self.get_student().name) except: break def show_student_course(self): print("学生选课情况如下:") with open("student_info","rb") as f: num = 0 while 1: try: num += 1 stu_obj = pickle.load(f) print(num,stu_obj.name,stu_obj.courses) except: break @classmethod def get_obj(cls,name): return Manager(name) #创建课程类,并设置对应的属性 class Course(): def __init__(self,name,price,teacher): self.name = name self.price = price self.teacher = teacher # 获得对象的显示状态,否则显示的是一个内存地址 def __repr__(self): return self.name # 登陆函数 def login(): user = input("请输入用户名:").strip() pwd = input("请输入密码:").strip() with open("userinfo") as f: for line in f: username,password,ident = line.strip().split("|") if username == user and password == pwd: return {"name":username,"identify":ident,"auth":True} else: return {"name":user,"identify":None,"auth":False} def main(): print("\33[0;34m欢迎使用学生选课系统\033[0m") ret = login() if ret["auth"]: print("\33[0;34m登陆成功,欢迎%s:%s\033[0m"%(ret["identify"],ret["name"])) if hasattr(sys.modules[__name__],ret["identify"]): cls = getattr(sys.modules[__name__],ret["identify"]) obj = cls.get_obj(ret["name"]) while True: for num,opt in enumerate(cls.operate_list,1): print(num,opt) inp = int(input("请选择要做的操作:")) if hasattr(obj,cls.operate_list[inp-1]): getattr(obj,cls.operate_list[inp-1])() else: print("\33[0;34m登录失败\033[0m") main()
选课系统
最新推荐文章于 2024-11-12 18:39:58 发布