学员管理系统-python面向对象最佳练习实例
2019-07-22 本文已影响11人
孟轲666
在开始一个项目的时候,不是急于去动手,而是在动手之前先分析需求,在分析的过程中一步步的完善大体的框架,然后先实现自己比较拿手的那部分。
好,话不多说,我们接下来正式开始
- 需求分析:
我们先来看下具体的需求:
程序名称: 选课系统
角色:学校、学员、课程、讲师
要求:
- 创建北京、上海 2 所学校
- 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
- 课程包含,周期,价格,通过学校创建课程
- 通过学校创建班级, 班级关联课程、讲师
- 创建学员时,选择学校,关联班级
- 创建讲师角色时要关联学校,
- 提供两个角色接口
- 学员视图, 可以注册, 交学费, 选择班级,
- 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
- 管理视图,创建讲师, 创建班级,创建课程
- 上面的操作产生的数据都通过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")