程序名称: 选课系统

角色:学校、学员、课程、讲师

要求:

1. 创建北京、上海 2 所学校

2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开

3. 课程包含,周期,价格,通过学校创建课程

4. 通过学校创建班级, 班级关联课程、讲师

5. 创建学员时,选择学校,关联班级

6. 创建讲师角色时要关联学校,

7. 提供两个角色接口

8. 学员视图, 可以注册, 交学费, 选择班级,

9. 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩

10. 管理视图,创建讲师, 创建班级,创建课程

11. 上面的操作产生的数据都通过pickle序列化保存到文件里

之前low的代码:

移步-》》 http://www.cnblogs.com/lianzhilei/p/5832691.html

想法:

选课系统是在第六节课学完面向对象时Alex给留的练习作业,当时写的程序得了个B+,当时写出了觉得自己还挺厉害的,不过现在看之前的代码惨不忍睹,纯粹为了实现要求而实现的功能,程序的扩展性很差;刚好最近复习到面向对象的内容,觉得这个作业确实不错(逻辑性很强),准备重新写一下,加上之前看过天帅的代码框架,觉得有一些启发,下面就开始搞起来!

写这个博客的目的,一是为了方便自己以后用到时去查询,二是记录下自己的思路,以后再看的时候,明白当前的想法(有想法的对比,才能看出自己进步了多少)

开始搞:

写程序的第一步就会遇到问题,因为alex给出的要求确实太乱了,这么多关联关系根本理不清,首先先把要求换成自己能懂得话,把逻辑关系重新屡一下

先来个框架:

三个视图:学员视图 讲师视图 管理视图 三个视图即为三个管理接口

五个角色:学校、学员、课程、讲师、班级 五个角色即需要定义5个类

把要求对应成自己看懂的话: ① 创建北京、上海 2 所学校 分析:定义学校类,通过类去创建学校实例
② 创建linux , python , go 3个课程 ,linux\py 在北京开,go 在上海开 分析:定义课程类,通过课程类去创建课程实例

③ 课程包含,周期,价格,通过学校创建课程 分析: 课程类里要包含周期、价格 课程实例通过学校类去创建

④ 班级关联课程、班级关联讲师 分析:可以创建班级的时候需输入关联的课程,创建讲师的时候需输入关联的班级; 一个班级对应一个课程 一个班级对应一个讲师

⑤ 通过学校创建班级, 班级关联课程、讲师 分析:跟 ④一样

⑥ 创建学员时,选择学校,关联班级 分析:定义学员类,创建时选择学校,选择班级, 通过学校类创建学员实例,班级类里面要有包含学员的信息的字典

⑦ 创建讲师角色时要关联学校 分析: 之前一样,依然通过学校类去创建讲师实例

⑧ 学员视图可以注册, 交学费, 选择班级 分析: 看 ⑥ 学员选择班级后,通过班级关联的课程,打印课程的学费

⑨ 讲师视图, 讲师可以.....bala....bala 分析: 讲师视图登录需要讲师名,通过讲师名可以找到对应的班级实例,班级实例里包含班级名,课程名,学员信息等

注: 一个班级对应一个课程 一个班级对应一个讲师

一个课程可有多个班级

一个讲师可教授多个班级

一个学员可学习多个班级的课

分析下管理视图:

管理视图具有的功能创建讲师, 创建班级,创建课程,这些都是通过学校创建(即通过学校类的方法调用),除了创建以外我们还需要增加查询讲师、班级、课程的功能(查看相应的信息), 管理视图要有6个功能

分析下讲师视图:

讲师视图可查看所授课的班级,班级学生信息 讲师视图具有2个功能

分析下学生视图:

学生视图,要选择学校,选择班级( 显示班级的名称,课程,价钱 ), 添加到对应的班级内

咋做数据库呢?!

看看注里面的内容就知道对应关系比较多,对应关系比较多就意味着,一个数据改了所有跟它有关系的数据都有变动,比如班级s14关联讲师alex,学生eric报名后,讲师alex自己的班级学生信息里就要能查到eric的个人信息;当然如果用数据库去做的话,非常简单;but 咱还没学数据库呢,只能用文件的方式存在本地,如果存多个文件的话,一个文件修改另一个文件也跟着修改(互相关联), 所以为了简便,就只定义一个伪数据库;通过 shelve模块,存储类型{“北京”:北京实例,“上海”:上海实例}

看我怎么做的类定义(只看__init__):

内容最小的学员类 : 只包含姓名,年龄,可扩展其他信息,关联信息不再这存

class Student(object): '''学生类,包含姓名,年龄''' def __init__(self,student_name,student_age): self.student_name = student_name self.student_age = student_age

都跟它有关系,但是他是被关系的课程类: 只包含周期,价格,名称,可扩展其他信息,被关联,啥关联信息都不用存

class Course(): '''定义课程类,包含名称,价格,周期''' 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 Class(object): '''班级类,包含名称,课程,学生''' def __init__(self,class_name,course_obj): self.class_name = class_name self.class_courese = course_obj self.class_student = {} #学生字典 {学生名:学生实例}

关联性单一,只跟班级相好的讲师类: 看 ⑨ 包含讲师名、薪资;讲师关联班级(对应关系在本类保存)班级成员列表,存放班级名(做判断,不会重复);通过班级名查看班级类里面的班级信息(包含学生),避免存双份数据

class Teacher(object): '''讲师类,定义teacher_name,teacher_salary,包含teacher_class''' def __init__(self, teacher_name, teacher_salary): self.teacher_name = teacher_name self.teacher_salary = teacher_salary self.teacher_calss = [] #班级列表 [s14,15] def teacher_add_class(self,class_name,class_obj): self.teacher_calss[class_name] = class_obj

内容最大,跟班级、课程、讲师都有关系的学校类: 包含学校名,学校地址,存放课程实例、班级实例、讲师实例,都是字典形式

class School(object): '''学校类,包含名称,地址,课程,班级,教师''' def __init__(self,school_name,school_addr): self.school_name = school_name self.school_addr = school_addr self.school_course = {} #学校所有的课程实例 {"课程名“:课程实例} self.school_class = {} self.school_teacher = {} #类型与course一致 #self.school_student = {} #可扩展学生

框架有了,类有了,业务逻辑还不so easy?!

直接放目录架构:

代码区:

程序入口bin下的start.py: 注:判断了系统环境,添加了环境变量,调用了主业务区main.py import os import sys import platform if platform.system() == "windows": BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1]) else: BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1]) sys.path.insert(0,BASE_DIR) #print(sys.path) from core import main from conf import settings if __name__ == '__main__': obj = main.Manage_center() obj.run() start.py 配置文件conf下的settings.py: 注:定义了数据库路径 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import os import sys import platform if platform.system() == "Windows": BASE_DIR = "\\".join(os.path.abspath(os.path.dirname(__file__)).split("\\")[:-1]) database_path = os.path.join(BASE_DIR,"database") else: BASE_DIR = "/".join(os.path.abspath(os.path.dirname(__file__)).split("/")[:-1]) database_path = os.path.join(BASE_DIR, "database") school_db_file = os.path.join(database_path,"school") settings.py 主业务core下的main.py: 注:定义了4个类,管理中心,学员视图,讲师视图,学校视图 import os import sys import shelve from conf import settings from modules.school import School class Manage_center(object): def __init__(self): pass def run(self): while True: print("\n欢迎进入CLASS_SYSTEM系统\n" "1 学生视图\n" "2 教师视图\n" "3 学校视图\n" "q 退出学员管理系统\n") user_choice = input("\033[34;0m请输入您要登录的视图:\033[0m") if user_choice == '1': Manage_student() elif user_choice == '2': Manage_teacher() elif user_choice == '3': Manage_school() elif user_choice == 'q': print("\033[34;1m感谢使用学员管理系统,退出\033[0m") break else: print("\033[31;1m请输入正确的选项\033[0m") class Manage_school(object): '''学校管理视图''' def __init__(self): if os.path.exists(settings.school_db_file+".dat"): #shelve会生成三个文件,其中有.dat结尾 self.school_db = shelve.open(settings.school_db_file) #打开学校数据库文件 self.run_manage() #运行管理视图 self.school_db.close() #关闭数据库文件 else: print("\33[31;1m系统信息:初始化数据库\33[0m") self.initialize_school() #初始化数据库 self.run_manage() self.school_db.close() def initialize_school

python选课系统的更多相关文章

  1. 一个简单的python选课系统

    下面介绍一下自己写的python程序,主要是的知识点为sys.os.json.pickle的模块应用,python程序包的的使用,以及关于类的使用. 下面是我的程序目录: bin是存放一些执行文件co ...

  2. python选课系统作业

    # 选课系统# 角色:学校.学员.课程.讲师# 要求:# 1. 创建北京.上海 2 所学校# 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海 ...

  3. python选课系统demo的小练习

    #简化选课系统代码:先登陆,然后判断身份并实例化,根据身份对应的类,让用户选择 class Manager: operate_dict=[ ('创造学生账号',"creat_student& ...

  4. python 选课系统

    couser.py: import sys,osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))sys.pa ...

  5. python之选课系统详解[功能未完善]

    作业需求 思路:1.先写出大体的类,比如学校类,学生类,课程类--   2.写出类里面大概的方法,比如学校类里面有创建讲师.创建班级-- 3.根据下面写出大致的代码,并实现其功能       遇到的困 ...

  6. Python开发程序:选课系统-改良版

    程序名称: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  7. python实现学生选课系统 面向对象的应用:

    一.要求: 选课系统 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 使用pickle保存在文件 学生: 学生:用户名.密码.性别.年龄.选课列表[].上课 ...

  8. Python开发程序:选课系统

    本节作业: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...

  9. python 面向对象 class 老男孩选课系统

    要求:1. 创建北京.上海 2 所学校 class2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含,周期,价格,通过学校创建课 ...

随机推荐

  1. ORACLE 分页 java 用jdbc方式以 sys账号连接oracle数据的问题

    2,3,4,6,8   betwenen 为闭区间,前后都包括 select * from(select a.*,rownum rn from (select * from student) a ) ...

  2. laravel数据迁移

    创建数据库迁移: php artisan make:migration create_表名_table 回车后就会创建迁移版本   回滚数据库迁移: php artisan migrate 会将数据按 ...

  3. js格式化文件大小,单位:Bytes、KB、MB、GB

    原文出自:https://blog.csdn.net/seesun2012 // 格式化文件大小 function renderSize(value){ if(null==value||value== ...

  4. Orchard源码:EventBus&EventHandler

    概述 看源码是一件吃力又很爽的事情,昨天还被搞的一头雾水,今天忽然守得云开见月明.明白它设计意图的同时,感觉自己又提升了一步:) Orchard刚开始看往往毫无头绪,建议可以从Orchard.Fram ...

  5. Vue 错误:Avoid mutating a prop directly

    Avoid mutating a prop directly since the value will be overwritten whenever the parent component re- ...

  6. [javaSE] 多线程(守护线程)

    我们一般使用多线程,都是while的死循环,想要结束线程,只需退出死循环即可 当线程中调用了sleep()方法或者wait()方法,当前的线程就会进入冻结状态,这个线程就结束不了 调用Thread对象 ...

  7. 二:HTML基础

    一:html语言基础 1.基本结构 <html> <head> <!--元信息:提供额外信息:关键字.作者信息.页面更新时间.设置字符编码--> <meta ...

  8. SSM迁移到Springboot记录

    日志问题 Exception in thread "main" java.lang.IllegalArgumentException: LoggerFactory is not a ...

  9. hdu 4193 Non-negative Partial Sums 单调队列。

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  10. sublime Text3汉化和激活注册码

    sublimeText3 很不错,前面几天下了vscore学习Node.js,感觉有点懵,今天下载sublimeText3,遇到的一些小问题,在这里说说: 百度云:https://pan.baidu. ...