学员管理系统-python面向对象最佳练习实例

在开始一个项目的时候,不是急于去动手,而是在动手之前先分析需求,在分析的过程中一步步的完善大体的框架,然后先实现自己比较拿手的那部分。

好,话不多说,我们接下来正式开始
  • 需求分析:
    我们先来看下具体的需求:

程序名称: 选课系统
角色:学校、学员、课程、讲师
要求:

  1. 创建北京、上海 2 所学校
  2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
  3. 课程包含,周期,价格,通过学校创建课程
  4. 通过学校创建班级, 班级关联课程、讲师
  5. 创建学员时,选择学校,关联班级
  6. 创建讲师角色时要关联学校,
  7. 提供两个角色接口
  8. 学员视图, 可以注册, 交学费, 选择班级,
  9. 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
  10. 管理视图,创建讲师, 创建班级,创建课程
  11. 上面的操作产生的数据都通过pickle序列化保存到文件里

我们接下来一条一条的分析:

需求 分析
1. 创建北京、上海2所学校 创建两所学校,肯定是要创建个学校的类,实例化两个对象就是两个具体的学校喽
2.创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 创建课程,课程肯定也是个类,课程要和学校关联
3.课程包含,周期,价格,通过学校创建课程 其中课程类的属性为:周期、价格,课程实例化是由学校实例化的
4.通过学校创建班级, 班级关联课程、讲师 班级也是个类,班级类的实例化也是由学校来实例化的,其中班级要关联课程,讲师
5.创建学员时,选择学校,关联班级 学员也是个类,学员要选择学校,和班级关联
6.创建讲师角色时要关联学校 讲师也是个类,讲师要关联学校
7.提供两个角色接口 要提供视图接口
8.学员视图, 可以注册, 交学费, 选择班级 学员视图的功能,注册、交学费、选择班级
9.讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩 讲师视图的功能
10.管理视图,创建讲师, 创建班级,创建课程 这个其实就是学校视图
11.上面的操作产生的数据都通过pickle序列化保存到文件里 这个就是数据库

总结:

三个视图:学员视图、讲师视图、学校视图 三个视图即三个管理接口
五个角色:学员、班级、课程、讲师、学校 五个角色即需要定义五个类

下面开始正式搬砖:

在搬砖之前,我们先应该定义好在那个位置搬什么样的砖,不能什么样的砖都放在一起,最后就会很乱。

  • 要有一个入口文件,就是程序的入口:bin文件,里面就是我们程序的入口:start.py
  • 要有一个database的文件,里面是我们存放数据库的位置
  • 要有一个模型module文件,里面放我们的角色数据
  • 要有一个配置文件,里面放我们的配置文件,setting.py
  • 要有一个主文件,里面是我们的主逻辑区
  • 还要有一个README.md记录我们的信息

module文件中:

student.py

class Student(object):
    """
    学生类
    属性:姓名、年龄
    """
    def __init__(self,student_name,student_age):
        self.student_name = student_name
        self.student_age = student_age
        

course.py

class Course(object):
    """
    课程类
    属性:课程名、价格、周期
    """
    def __init__(self,course_name,course_price,course_time):
        self.course_name = course_name
        self.course_price = course_price
        self.course_time = course_time

class.py

class Classes(object):
    """
    班级类
    属性:班级名、关联的课程
    """
    def __init__(class_name,course_obj):
        self.class_name = class_name
        self.class_course = course_obj
        self.class_student = {}

teacher.py

class Teacher(object):
    """
    老师类
    属性:老师名字、老师薪水
    """
    def __init__(self,teacher_name,teacher_salary):
        self.teacher_name = teacher_name
        self.teacher_salary = teacher_salary
        self.teacher_class = {}

    def teacher_add_class(self,class_name,class_obj):
        self.teacher_class[class_name] = class_obj

school.py

from module.course import Course
from module.class import Classes
from module.teacher import Teacher
from module.student import Student

class School(object):
    """
    学校类
    属性:学校名、学校地址、学校老师实例、学校课程实例、学校班级实例
    """
    def __init__(self,school_name,school_addr):
        self.school_name = school_name
        self.school_addr = school_addr
        self.school_class = {}
        self.school_teacher = {}
        self.school_course = {}
        #self.school_student = {}

    def creat_course(self,course_name,course_price,course_time):
        '''创建课程'''
        course_obj = Course(course_name,course_price,course_time)
        self.school_course[course_name] = course_obj

    def show_course(self):
        '''查看课程'''
        for k in self.school_course:
            course_obj = self.course[k]
            print("\33[32;1m课程:%s\t价格:%s\t周期:%s月\33[0m"%(course_obj.course_name,couese_obj.course_price,course_time))


    def creat_class(self,class_name,couse_obj):
        '''创建班级'''
        class_obj = Classes(class_name,course_obj)
        self.school_class[class_name] = class_obj

    def show_class(slef):        
        '''查看班级'''
        for key in self.school_class:
            class_obj = self.school_class[key]
            print("\33[32;1m班级:%s\t班级关联的课程%s\33[0m"%(class_obj_class_name,class_obj.course_obj.course_name))

    def show_class_course(self):
        '''查看班级关联课程'''
        for key in self.school_class:
            class_obj = self.school_class[key]
            course_obj = class_obj.class_course
            print("\33[32;1m班级:%s\t课程:%s\t价格:%s\t周期:%s月\33[0m"%(class_obj.class_name,course_obj.course_name,course_obj.course_price,course_obj.course_time))

    def creat_student(self,student_name,student_age,class_choice):
        '''创建学员实例'''
        student_obj = Student(student_name,student_age)
        class_obj = self.school_class[class_choice]
        class_obj.class_student[student_name] = student_obj
        self.school_class[class_choice] = class_obj

    def creat_teacher(self,teacher_name,teacher_salary,class_name,class_obj):
        '''创建老师实例'''
        teacher_obj = Teacher(teacher_name,teacher_salary)
        teacher_obj. teacher_add_class(class_name,class_obj)
        self.school_teacher[teacher_name] = teacher_obj

    def show_teacher(self):
        '''查看老师'''
        for key in self.school_teacher:
            teacher_obj = self.school_teacher[key]
           class_list = []
           for k in teacher_obj.teacher_class:
               class_list.append(k)
           print("\33[32;1m老师%s\t薪水%s\t关联班级%s\33[0m"%(teacher_obj.teacher_name,teacher_obj.teacher_salary,class_list))


    def teacher_class_inifo(self,teacher_name):
        '''老师所带班级的信息'''
        teacher_obj = self.school_teacher[teacher_name]
        for k in teacher_obj.teacher_class:
            class_obj = self.school_class[k]
            student_list = []
            for i in class_obj.class_student:
                student_list.appent(i)
            print("\33[31;1m老师:%s\t关联课程:%s\t学员:%s"%(teacher_name,class_obj.class_course.course_name,student_list))

    def update_teacher(self,teacher_name,class_name,class_course):
        '''更新讲师'''
        teacher_obj = self.school[teacher_name]
        teacher_obj.teacher_add_class(class_name,class_course)

配置文件conf

setting.py

import os
import platform

if platform.system() == "Window":
    BASE_DIR ='\\'.join(os.path.abspath(os.path.dirname(__file__)).splite['\\'][:-1])
    database_path = os.path.join(BASE_DIR,db)
else:
    BASE_DIR ='/'.join(os.path.abspath(os.path.dirname(__file__)).splite['/'][:-1])
    database_path = os.path.join(BASE_DIR,db)
school_db_file = os.path.join(database_path,school)

数据库文件db

school.db

该文件自动生成

core模块

main.py

from conf import setting
from module.school import School
import shelve

class Manage_center(object):
    def __init__(self):
        pass
    def run(self):
        while True:
            print("\n欢迎进入学员管理系统\n"
                  "1 学生视图\n"
                  "2 教师视图\n"
                  "3 学校视图\n"
                  "q 退出学员管理系统\n")
            user_choice = raw_input("\33[34;1m请输入您要登录的视图\33[0m")
            if user_chioice == '1':
                Manage_student()
            elif user_choice == '2':
                Manage_teacher()
            elif user_choice == '3':
                Manage_school()
            elif user_choice == 'q':
                print("\33[34;1m感谢使用学员管理系统,退出\33[0m")
                break
             else:
                print("\33[34;1m请输入正确的选项\33[0m")

class Manage_student(object):
    '''学员视图'''
    def __init__(self):
        self.run_manage()
class Manage_teacher(object):
    '''讲师视图'''
class Manage_school(object):
    '''学校视图'''
    def __init__(self):
        if os.path.exist(setting.school_db_file+'.db'):
            self.school_db = shelve.open(setting.school_db_file)
            self.run_manage():
            self.school_db.close()
        else:
            self.initialize_school()
            self.run_manage()
            self.school_db.close()

    def initialize_school(self):
        self.school_db = shelve.open(setting.school_db_file)
        self.school['北京'] = School('北京','中国.北京')
        self.school['上海'] = School('上海','中国.上海')

    def run_manage(self):
        for key in self.school_db:
             print("学校名称:",key)
        choice_school = raw_input("\33[34;1m请输入您要管理的学校\33[0m").strip()
        if choice_school in self.school_db:
            self.choice_school = choice_school
            self.school_obj = self.school_db[choice_school]
            while True:
                print("\n欢迎来到老男孩%s校区\n"
                          "添加课程 add_course\n"
                          "增加班级 add_class\n"
                          "招聘讲师 add_teacher\n"
                          "查看课程 check_course\n"
                          "查看班级 check_class\n"
                          "查看讲师 check_teacher\n"
                          "退出程序 exit"%self.school_obj.school_name)
            user_func = raw_input("\33[34;1m请输入要操作的指令\33[0m")
            if hasattr(self,user_func):
                getattr(self,user_func)()
        else:
            print("\33[31;1m请输入正确的学校\33[0m")
    def add_course(self):
        '''添加课程'''
        course_name = raw_input("\33[34;1m请输入要添加的课程名\33[0m")
        course_price = raw_input("\33[34;1m请输入要添加的课程的价格\33[0m")
        course_time = raw_input("\33[34;1m请输入要添加的课程的周期\33[0m")
        if course_name in self.school_obj.school_course:
            print("\33[32;1m课程存在\33[0m")
            self.school_obj.creat_course(course_name,course_price,course_time)
            print("\33[32;1m更新完成\33[0m")
        else:
            self.school_obj.creat_course(course_name,course_price,course_time)
            print("\33[32;1m课程添加完成\33[0m")
       self.school_db.update({self.choice_school:self.school_obj})
            
    def add_class(self):
        '''增加班级'''
    def add_teacher(self):
        '''招聘讲师'''
    def check_course(self):
        '''查看课程'''
    def check_class(self):
        '''查看班级'''
    def check_teacher(self):
        '''查看讲师'''
    def exit(self):
        self.school_db.close()
        sys.exit("\33[32;1m欢迎下次使用学员管理系统\33[0m")

        

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 练习题 面向对象三大特性,各有什么用处,说说你的理解。 类的属性和对象的属性有什么区别? 面向过程编程与面向对象编...
    飞鸟在笼阅读 7,476评论 0 1
  • Day06的课程要点记录详细教程地址:Day6 - 面向对象学习 上节补遗 - Subprocess模块 os.s...
    乘风逐月阅读 290评论 0 0
  • 作业:选课系统 一、作业要求:选课系统 角色:学校、学员、课程、讲师要求: 创建北京、上海 2 所学校 创建lin...
    乘风逐月阅读 610评论 0 0
  • 翻译自“Collection View Programming Guide for iOS” 0 关于iOS集合视...
    lakerszhy阅读 3,725评论 1 22
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,867评论 0 9