[ python ] 面向对象 - 选课系统
根据源程序进行改写:
原程序地址:http://www.cnblogs.com/lianzhilei/p/5985333.html 如有侵权立即删除。
感谢原作者将完整的代码提供参考。
原作者的代码是通过 shelve 模块实现的,非常完美。具体参考上面的链接地址;以下我改写代码是通过 pickle 模块来实现。主要做为练习:
README
class_system-pickle 选课系统根目录
├── bin
│ ├── __init__.py
│ └── start.py 程序入口
├── conf
│ ├── __init__.py
│ └── settings.py 配置文件 - 主要存储数据库文件目录
├── core
│ ├── __init__.py
│ ├── manage_center.py 主菜单入口
│ ├── school_center.py 学校中心功能点实现
│ ├── student_center.py 学生中心功能点实现
│ └── teacher_center.py 讲师中心功能点实现
├── db
│ ├── __init__.py
│ └── school_dict 数据库文件(运行程序自动初始化生成)
└── modules
├── course.py 课程类
├── grade.py 班级类
├── __init__.py
├── school.py 学校类
├── student.py 学生类
├── teacher.py 讲师类
└── tools.py 工具包 - 对数据库文件读写操作 5 directories, 18 files 代码实现逻辑请阅读原作者链接。
基于 pickle 序列化的代码如下:
bin
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
from conf.settings import school_db_file
from core.manage_center import Manage_center if __name__ == '__main__':
obj = Manage_center()
obj.run()
start.py
conf
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) school_db_file = os.path.join(BASE_DIR, 'db', 'school_dict')
teacher_db_file = os.path.join(BASE_DIR, 'db', 'school_dict')
settings.py
db
(不需要手动创建文件,启动程序自动生成数据文件)
core
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
from core.school_center import School_center
from core.student_center import Student_center
from core.teacher_center import Teacher_center class Manage_center(object):
def __init__(self):
pass def run(self):
while True:
print('1. 学校中心\n'
'2. 讲师中心\n'
'3. 学生中心\n'
'4. 退出')
choice = input('>>>').strip()
if choice == '':
School_center()
elif choice == '':
Teacher_center()
elif choice == '':
Student_center()
elif choice == '':
break
else:
print('\033[31;1m输入错误,请重新输入.\033[0m')
manage_center.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import os, sys, pickle
from conf.settings import school_db_file
from modules.tools import file_oper
from modules.school import School class School_center(object):
def __init__(self):
if not os.path.exists(school_db_file):
self.init_school()
self.school_db = file_oper(school_db_file, 'rb')
self.manage_run()
else:
self.school_db = file_oper(school_db_file, 'rb')
self.manage_run() def init_school(self):
sh = School('上海', '上海市')
bj = School('北京', '北京市')
data = {'上海': sh, '北京': bj}
file_oper(school_db_file, 'wb', data) def manage_run(self):
for key in self.school_db:
print('学校名:', key) choice_school = input('>>>').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'
'查看课程 check_course\n'
'创建班级 add_grade\n'
'查看班级 check_grade\n'
'创建讲师 add_teacher\n'
'查看讲师 check_teacher\n'
'退出系统 exit' % choice_school) user_func = input('>>>').strip()
if hasattr(self, user_func):
getattr(self, user_func)() def add_course(self):
course_name = input('\033[34;1m输入课程名:\033[0m')
course_price = input('\033[34;1m输入课程价格:\033[0m')
course_time = input('\033[34;1m输入课程周期:\033[0m')
if course_name not in self.school_obj.school_course:
self.school_obj.create_course(course_name, course_price, course_time)
self.school_db[self.choice_school] = self.school_obj
file_oper(school_db_file, 'wb', self.school_db)
print('\033[32;1m课程新增成功。\033[0m')
else:
print('\033[31;1m课程信息已存在.\033[0m')
self.school_obj.create_course(course_name, course_price, course_time)
print('\033[32;1m课程更新成功。\033[0m') def check_course(self):
self.school_obj.show_course() def add_grade(self):
grade_name = input('\033[34;1m输入班级名:\033[0m')
course_name = input('\033[34;1m输入班级要上的课程名:\033[0m')
if course_name in self.school_obj.school_course:
course_obj = self.school_obj.school_course[course_name]
if grade_name not in self.school_obj.school_grade:
self.school_obj.create_grade(grade_name, course_obj)
self.school_db[self.choice_school] = self.school_obj
file_oper(school_db_file, 'wb', self.school_db) else:
print('\033[31;1m班级信息已存在.\033[0m')
else:
print('\033[31;1m课程信息不存在.\033[0m') def check_grade(self):
self.school_obj.show_grade() def add_teacher(self):
teacher_name = input('\033[34;1m输入讲师名:\033[0m')
teacher_salary = input('\033[34;1m输入讲师薪资:\033[0m')
grade_name = input('\033[34;1m输入讲师关联的班级:\033[0m')
if grade_name in self.school_obj.school_grade:
grade_obj = self.school_obj.school_grade[grade_name]
if teacher_name not in self.school_obj.school_teacher:
self.school_obj.create_teacher(teacher_name, teacher_salary, grade_name, grade_obj)
print('\033[32;1m讲师新增成功.\033[0m')
else:
print('\033[31;1m讲师信息已存在.\033[0m')
self.school_obj.create_teacher(teacher_name, teacher_salary, grade_name, grade_obj)
print('\033[32;1m讲师更新成功.\033[0m')
self.school_db[self.choice_school] = self.school_obj
file_oper(school_db_file, 'wb', self.school_db)
else:
print('\033[31;1m班级信息不存在,请先创建班级.\033[0m') def check_teacher(self):
self.school_obj.show_teacher() def exit(self, *args):
sys.exit('欢迎下次使用选课系统.')
school_center.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import os, sys, pickle
from conf.settings import school_db_file
from modules.tools import file_oper
from modules.school import School class Student_center(object):
def __init__(self):
if os.path.exists(school_db_file):
self.school_db = file_oper(school_db_file, 'rb')
self.manage_run()
else:
print('\033[31;1m数据库文件不存在,请先初始化.\033[0m') def manage_run(self):
for key in self.school_db:
print('学校名:', key)
choice_school = input('>>>').strip()
if choice_school in self.school_db:
self.choice_school = choice_school
self.school_obj = self.school_db[choice_school]
student_name = input('\033[34;1m输入学生名:\033[0m').strip()
student_age = input('\033[34;1m输入学生年龄:\033[0m').strip()
self.school_obj.show_grade_course()
grade_name = input('\033[34;1m输入要选择的班级名:\033[0m')
if grade_name in self.school_obj.school_grade:
self.school_obj.create_student(student_name, student_age, grade_name)
self.school_db[self.choice_school] = self.school_obj
file_oper(school_db_file, 'wb', self.school_db)
print('\033[32;1m选课成功.\033[0m') else:
print('\033[31;1m班级信息不存在.\033[0m')
student_center.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import os, sys
from modules.tools import file_oper
from conf.settings import school_db_file, teacher_db_file class Teacher_center(object):
def __init__(self):
if os.path.exists(school_db_file):
self.school_db = file_oper(school_db_file, 'rb')
self.manage_run()
else:
print('\033[31;1m数据库不存在,请初始化数据库.')
exit(1)
# if not os.path.exists(teacher_db_file):
# self.init_teacher()
# self.manage_run()
# else:
# self.teacher_db = file_oper(teacher_db_file, 'rb')
# self.manage_run() def init_teacher(self):
data = {}
file_oper(teacher_db_file, 'wb', data) def manage_run(self):
for key in self.school_db:
print('学校名:', key)
choice_school = input('\033[34;1m输入学校名:\033[0m')
if choice_school in self.school_db:
self.choice_school = choice_school
self.school_obj = self.school_db[choice_school]
teacher_name = input('\033[34;1m输入讲师名:\033[0m')
if teacher_name in self.school_obj.school_teacher:
while True:
print('\n欢迎进入讲师中心\n'
'查看班级信息 check_grade\n'
'退出 exit') user_func = input('>>>').strip()
if hasattr(self, user_func):
getattr(self, user_func)(teacher_name) def check_grade(self, teacher_name):
self.school_obj.show_teacher_grade(teacher_name) def exit(self, *args):
sys.exit('欢迎下次使用选课系统.')
teacher_center.py
modules
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey 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
course.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey class Grade(object):
def __init__(self, grade_name, course_obj):
self.grade_name = grade_name
self.course_obj = course_obj
self.grade_student = {}
grade.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import pickle
from modules.course import Course
from modules.grade import Grade
from modules.teacher import Teacher
from modules.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_course = {}
self.school_grade = {}
self.school_teacher = {} def create_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 key in self.school_course:
course_obj = self.school_course[key]
print('\033[32;1m课程【%s】\t价格【%s元】\t周期【%s个月】\033[0m' % (
course_obj.course_name, course_obj.course_price, course_obj.course_time)) def create_grade(self, grade_name, course_obj):
grade_obj = Grade(grade_name, course_obj)
self.school_grade[grade_name] = grade_obj def show_grade(self):
for key in self.school_grade:
grade_obj = self.school_grade[key]
print('\033[32;1m班级名【%s】\t课程【%s】\033[0m' % (grade_obj.grade_name, grade_obj.course_obj.course_name)) def create_teacher(self, teacher_name, teacher_salary, grade_name, grade_obj):
teacher_obj = Teacher(teacher_name, teacher_salary)
teacher_obj.teacher_add_grade(grade_name, grade_obj)
self.school_teacher[teacher_name] = teacher_obj def show_teacher(self):
for key in self.school_teacher:
teacher_obj = self.school_teacher[key]
grade_list = []
for key in teacher_obj.teacher_grade:
grade_list.append(key)
print('\033[32;1m讲师【%s】\t薪资【%s】\t班级列表【%s】\033[0m' % (
teacher_obj.teacher_name, teacher_obj.teacher_salary, grade_list)) def show_grade_course(self):
for key in self.school_grade:
grade_obj = self.school_grade[key]
course_obj = grade_obj.course_obj
print('\033[32;1m班级【%s】\t课程【%s】\t价格【%s元】\t周期【%s个月】\033[0m' % (
grade_obj.grade_name, course_obj.course_name, course_obj.course_price, course_obj.course_time)) def create_student(self, student_name, student_age, grade_name):
student_obj = Student(student_name, student_age)
grade_obj = self.school_grade[grade_name]
grade_obj.grade_student[student_name] = student_obj def show_teacher_grade(self, teacher_name):
teacher_obj = self.school_teacher[teacher_name]
for key in teacher_obj.teacher_grade:
grade_obj = teacher_obj.teacher_grade[key]
student_list = []
for st in grade_obj.grade_student:
student_list.append(st)
print('\033[32;1m班级【%s】课程【%s】学生列表【%s】\033[0m' % (
grade_obj.grade_name, grade_obj.course_obj.course_name, student_list))
school.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey class Student(object):
def __init__(self, student_name, student_age):
self.student_name = student_name
self.student_age = student_age
student.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey class Teacher(object):
def __init__(self, teacher_name, teacher_salary):
self.teacher_name = teacher_name
self.teacher_salary = teacher_salary
self.teacher_grade = {} def teacher_add_grade(self, grade_name, grade_obj):
self.teacher_grade[grade_name] = grade_obj
teacher.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey
import pickle def file_oper(file, mode, *args):
if mode == 'wb':
data = args[0]
with open(file, mode) as f:
pickle.dump(data, f)
elif mode == 'rb':
with open(file, mode) as f:
data = pickle.load(f)
return data
tools.py
[ python ] 面向对象 - 选课系统的更多相关文章
- Python作业-选课系统
目录 Python作业-选课系统 days6作业-选课系统: 1. 程序说明 2. 思路和程序限制 3. 选课系统程序目录结构 4. 测试帐户说明 5. 程序测试过程 title: Python作业- ...
- python之选课系统详解[功能未完善]
作业需求 思路:1.先写出大体的类,比如学校类,学生类,课程类-- 2.写出类里面大概的方法,比如学校类里面有创建讲师.创建班级-- 3.根据下面写出大致的代码,并实现其功能 遇到的困 ...
- python编辑选课系统
一.需求分析 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包含,周期,价格,通过学校创建课 ...
- Python作业选课系统(第六周)
作业需求: 角色:学校.学员.课程.讲师.完成下面的要求 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 ...
- Python 28 选课系统的讲解
1.首先我们要对每一个新的项目有一个明确的思路,脑子是好东西,但是好记性不如烂笔头,所以,要把能想到的都写下来 2.然后就是创建项目的整体结构框架,比如说:conf ( 配置文件 ) .core ( ...
- 一个简单的python选课系统
下面介绍一下自己写的python程序,主要是的知识点为sys.os.json.pickle的模块应用,python程序包的的使用,以及关于类的使用. 下面是我的程序目录: bin是存放一些执行文件co ...
- python实现学生选课系统 面向对象的应用:
一.要求: 选课系统 管理员: 创建老师:姓名.性别.年龄.资产 创建课程:课程名称.上课时间.课时费.关联老师 使用pickle保存在文件 学生: 学生:用户名.密码.性别.年龄.选课列表[].上课 ...
- python 面向对象 class 老男孩选课系统
要求:1. 创建北京.上海 2 所学校 class2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含,周期,价格,通过学校创建课 ...
- python基础-10 程序目录结构 学生选课系统面向对象练习
一 程序目录结构 1 bin文件夹 二进制文件.代码程序 2 conf 配置文件 3 帮助文档 4 头文件库文件等 二 学生选课系统部分代码 未完待续 1 包内的__init__.py文件 在包 ...
随机推荐
- 【刷题】洛谷 P3808 【模板】AC自动机(简单版)
题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...
- CF662C Binary Table 枚举 FWT
题面 洛谷题面 (虽然洛谷最近有点慢) 题解 观察到行列的数据范围相差悬殊,而且行的数量仅有20,完全可以支持枚举,因此我们考虑枚举哪些行会翻转. 对于第i列,我们将它代表的01串提取出来,表示为\( ...
- android adb devices 后出现offline问题的解决
Android在使用adb 命令时有时会发现设备的状态是offline,我的神呀,这怎么让我们调试呢.必须解决这个问题. 解决方式如下: 以下方法请确保你的设备处于调试模式下. 方法一:执行 #adb ...
- MySQL自定义函数、触发器、存储过程
存储过程 概念 存储过程,是一个数据库对象,类似一个函数. 在存储过程中可以使用SQL中的绝大部分内容,并且可以加入编程语言的特性(循环判断分支). 编写好存储过程之后,可以在客户端调用存储过程,存储 ...
- webstorm 激活破解方法大全
webstorm 作为最近最火的前端开发工具,也确实对得起那个价格,但是秉着勤俭节约的传统美德,我们肯定是能省则省啊. 方法一:(更新时间:2018/1/23)v3.3 注册时,在打开的License ...
- (转) 使用vivado创建工程 2
Build the hardware platform and export to SDK A basic ARM hardware platform is now configured. The c ...
- 前端PHP入门-004-数据类型,特别需要注意字符串
人类世界对万事万物都有种类划分,例如: 哺乳动物 人.猫.马.鸭嘴兽-.等等 蔬菜 西红柿.波菜.茄子-.等等 水果 西瓜.桃子.苹果-.等等 数据类型:就是对数据分类的一个划分而已 整型就是整数 我 ...
- OpenCV---Canny边缘提取
一:Canny算法介绍 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边缘要尽可能与实际图像中的实 ...
- Nodejs文件监控chokidar
最近有个需求是扫描用例,用例是放在svn上,如果每次扫描都去遍历目录的话会有占用太多的io,所以想着用文件监控,有文件变化时只对该文件进行操作. Nodejs里的 chokidar 模块可以更好的对文 ...
- 关于Java泛型深入理解小总结
1.何为泛型 首先泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,原理类似如下代码 int pattern; //声 ...