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)
student类

 

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
admin类
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('请输入数字!')
main
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')
settings
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()
start

 

posted @ 2018-09-17 15:05  CP喜欢晒太阳  阅读(118)  评论(0)    收藏  举报