day 07 面向对象进阶 - 学生选课系统
讲了反射,印象深刻。还有几个方法,以后慢慢用上。女神好不容易渐入佳境,又要走了。这周继续写选课系统,用上了反射,用到了pickcle。
(之前写好的)先把这个给占上。选课系统,写了两周,这是第二周。加了一些其他功能(虽然我都没实现),还有就是分成文件夹,这个一开始觉得很难,很繁琐,慢慢试下来也OK了。唯一困扰我许久的就是,选课这个功能,我倒是选上了,但是就是写进文件再读的是时候,是空的,弄了半天,无果。最后就这样交上去了,按类分成了文件夹。
直到周一,开哥在群里发了参考,乍一看,没啥。后来再细想,为啥自己没实现,因为一个 self!!这就是面向对象的精髓所在了,先是entry()函数,通过login()登陆后,实例化一个对象。问题就在这,执行各种类的功能之前,先实例化好了一个对象,他就在那儿,而他在类函数中叫什么呢?一个词,self!之所以一直course是[ ],就是因为不理解这个,在执行类函数的时候,又实例化了一个对象obj,就把之前的给覆盖了呀,必然是空列表呀。通畅了。(9.3周一)
上面一段是有天突然解决了不能查看已选课程的问题。这个选课也持续挺久的,还不是很明白,老师分配课程啥的都还没弄。再看看吧
import pickle from core import father from conf import settings class Student(father.Father):#学生类 operation_list = [('查看可选课程','check_to_choose'),('选择课程','choose_course'), ('查看已选课程', 'check_chosen_course'),('退出','log_out')] def __init__(self,name): self.name = name self.course = [] def check_to_choose(self):#查看可选课程 self.check_course() def choose_course(self):#选课 with open(settings.courseinfo,'rb') as f: i = 1 l = [] #用列表显示课程 while 1: try: obj = pickle.load(f) i += 1 l.append((obj.name,obj.price,obj.period)) except EOFError: break while 1: a = input('是否继续?(q或Q退出,其他任意键继续)\n') if a.upper() == 'Q': break else: print('可选课程如下:') for index, j in enumerate(l, 1): print(index, j) choice = input('输入数字选择对应课程:') if choice.isdigit(): choice = int(choice) if choice in range(1,len(l) + 1): self.course.append(l[choice-1]) print('选课成功') with open(settings.select_course, 'ab') as f1: pickle._dump(self, f1) else: print('请输入正确的数字') else: print('请输入数字') def check_chosen_course(self):#查看已选课程 with open(settings.select_course,'rb') as f: while 1: try: obj = pickle.load(f) print(obj) except EOFError: # print(obj,obj.name,obj.course) break print(111,self) if self.name == obj.name: print(obj.name, '已选', obj.course)
import pickle from core import father from core import course from core import student from core import teacher from core import banji from tool import Md5 from conf import settings class Admin(father.Father): #管理员类 operation_list = [('创建学生账号','create_stu'),('创建课程','create_course'), ('查看全部课程','check_all_course'),('查看全部学生','check_stu'), ('查看选课情况','check_situation'),('创建讲师','create_teacher'), ('创建班级','create_class'),('为讲师分配班级','tea_class'), ('为学生分配班级','stu_class'),('退出','log_out')] def __init__(self,name): self.name = name def create_stu(self):#创建学生账号 while 1: a = input('创建学生账号(q或Q退出,其他任意键继续)\n') if a.upper() == 'Q': break else: print('---创建学生账户---') account = input('设置用户名:').strip() key = input('设置密码:').strip() key = Md5.get_md5(key) f = open(settings.userinfo, 'a', encoding='utf-8') f.write('\n%s|%s|Student' % (account, key)) # 追加到用户文件 print('学生%s的信息创建成功' % account) f.close() stu_obj = student.Student(account) #实例化一个学生对象,存入文件 self.write_file(settings.stuinfo,'ab',stu_obj) def create_course(self):#创建课程 while 1: a = input('创建课程(q或Q退出,其他任意键继续)\n') if a.upper() == 'Q': break else: name = input('输入要创建的课程名:').strip() price = input('输入课程价格:').strip() period = input('输入课程周期:').strip() course_obj = course.Course(name,price,period) self.write_file(settings.courseinfo,'ab',course_obj) print('创建课程成功') def check_all_course(self):#查看全部课程 self.check_course() #调用父类的方法 def check_stu(self): #查看全部学生 with open(settings.stuinfo, 'rb') as f: while 1: try: stu = pickle.load(f) print('姓名:',stu.name) except EOFError: break def check_situation(self):#查看所有学生选课情况 with open(settings.select_course, 'rb') as f: while 1: try: stu_course = pickle.load(f) except EOFError: break def create_teacher(self):#创建讲师 while 1: a = input('创建讲师(q或Q退出,其他任意键继续)\n') if a.upper() == 'Q': break else: print('---创建讲师账户---') account = input('设置用户名:').strip() key = input('设置密码:').strip() key = Md5.get_md5(key) f = open(settings.userinfo, 'a', encoding='utf-8') f.write('\n%s|%s|Teacher' % (account, key)) # 追加到用户文件 print('讲师%s的信息创建成功' % account) f.close() tea_obj = teacher.Teacher(account) #实例化一个讲师对象,存入文件 self.write_file(settings.teainfo,'ab',tea_obj) def create_class(self): #创建班级 while 1: a = input('创建班级(q或Q退出,其他任意键继续)\n') if a.upper() == 'Q': break else: print('---创建班级---') classname = input('输入班级名称:').strip() class_obj = banji.Class(classname) self.write_file(settings.classinfo, 'ab', class_obj) print('班级信息创建成功') def tea_class(self):#为讲师分配班级 pass def stu_class(self):#为学生分配班级 pass
import sys import os base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(base_path) from core import auth from core.admin import Admin from core.student import Student from core.teacher import Teacher def entry(): #程序入口 ret = auth.login() if ret: print('正在跳转到主页') cls = getattr(sys.modules[__name__], ret['identity'])#通过身份拿到对应的类 obj = cls(ret['name']) while 1: for index, i in enumerate(cls.operation_list, 1): print(index, i[0]) choice = input('输入数字执行对应功能:') if choice.isdigit(): choice = int(choice) if choice in range(1, len(cls.operation_list) + 1): operation = cls.operation_list[choice - 1][1] getattr(obj, operation)() else: print('输入数字有误,请重新输入!') else: print('请输入数字!')
import pickle from conf import settings class Father(object): #父类 def log_out(self): #退出 exit('已退出选课系统') def check_course(self):#查看课程 with open(settings.courseinfo,'rb') as f: while 1: try: obj = pickle.load(f) print('课程名:%s 价格:%s 周期:%s'%(obj.name,obj.price,obj.period)) except EOFError: break def write_file(self,file_path,mode_type,file_content):# 定义一个专门写文件 with open(file_path,mode_type) as f: pickle.dump(file_content,f)
import os import sys base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(base_path) userinfo = os.path.join(base_path,'db','用户信息.txt') courseinfo = os.path.join(base_path,'db','课程信息.txt') stuinfo = os.path.join(base_path,'db','学生信息.txt') select_course = os.path.join(base_path,'db','选课信息.txt') teainfo = os.path.join(base_path,'db','讲师信息.txt') classinfo = os.path.join(base_path,'db','班级信息.txt')
import os import sys base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(base_path) from core import main if __name__ == '__main__': main.entry()

浙公网安备 33010602011771号