python面向对象思维之选课系统
了解一点面向对象作用:
对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,大家虽然都知道OOP的三大特性是继承、封装、多态,并且大家也都知道了如何定义类、方法等面向对象的常用语法,但是一到真正写程序的时候,还是很多人喜欢用函数式编程来写代码,特别是像我一样的初学者,很容易陷入一个窘境就是“我知道面向对象,我也会写类,但我依然没发现在使用了面向对象后,对我们的程序开发效率或其它方面带来什么好处,因为我使用函数编程就可以减少重复代码并做到程序可扩展了,为啥子还用面向对象?”。
- 写重复代码是非常不好的低级行为
- 你写的代码需要经常变更
python选课系统安排上:
需求:
角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师
5. 创建学员时,选择学校,关联班级
6. 创建讲师角色时要关联学校,
7. 提供三个角色接口
7.1 学员视图, 可以注册, 交学费, 选择班级,
7.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员 列表 , 修改所管理的学员的成绩
7.3 管理视图,创建讲师, 创建班级,创建课程
解决方法:
解决这个问题之前,我们先来了解一下传说中的-----领域模型
领域模型
好了,假设你现在会了面向对象的各种语法了,我相信你可能是蒙蔽的, 学会了面向对象的语法,却依然写不出面向对象的程序。
原因是什么呢?原因就是因为你还没掌握一门面向对象设计利器。
答案就是:领域建模。 从领域模型开始,我们就开始了面向对象的分析和设计过程,可以说,领域模型是完成从需求分析到面向 对象设计的一座桥梁。
领域模型,顾名思义,就是需求所涉及的领域的一个建模,更通俗的讲法是业务模型。 参考百度百科(http://baike.baidu.cn/view/757895.htm ),领域模型定义如下:
从这个定义我们可以看出,领域模型有两个主要的作用:
- 发掘重要的业务领域概念
- 建立业务领域概念之间的关系
领域建模三字经
领域模型如此重要,很多同学可能会认为领域建模很复杂,需要很高的技巧。然而事实上领域建模非常简 单,简单得有点难以让人相信,领域建模的方法概括一下就是“找名词”! 许多同学看到这个方法后估计都会笑出来:太假了吧,这么简单,找个初中生都会啊,那我们公司那些分 析师和设计师还有什么用哦?
分析师和设计师当然有用,后面我们会看到,即使是简单的找名词这样的操作,也涉及到分析和提炼,而 不是简单的摘取出来就可,这种情况下分析师和设计师的经验和技能就能够派上用场了。但领域模型分析 也确实相对简单,即使没有丰富的经验和高超的技巧,至少也能完成一个能用的领域模型。
虽然我们说“找名词”很简单,但一个关键的问题还没有说明:从哪里找? 如果你还记得领域模型是“需求到面向对象的桥梁”,那么你肯定一下子就能想到:从需求模型中找,具 体来说就是从用例中找。
归纳一下域建模的方法就是“从用例中找名词”。 当然,找到名词后,为了能够更加符合面向对象的要求和特点,我们还需要对这些名词进一步完善,这就 是接下来的步骤:加属性,连关系!
最后我们总结出领域建模的三字经方法:找名词、加属性、连关系。
再看一下需求:
1. 创建北京、上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包含,周期,价格,通过学校创建课程 4. 通过学校创建班级, 班级关联课程、讲师 5. 创建学员时,选择学校,关联班级 6. 创建讲师角色时要关联学校, 7. 提供三个角色接口 7.1 学员视图, 可以注册, 交学费, 选择班级, 7.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员 列表 , 修改所管理的学员的成绩 7.3 管理视图,创建讲师, 创建班级,创建课程
1.找名词
who : 学员、讲师、管理员
2.加属性
分析一下:各个角色固有的属性,学员、教师、管理员各要实现哪些功能?这些功能就是属性,通过在类中定义对应的方法来实现。
3.连关系
所谓连关系就是将各属性分门别类,通过其他函数和用户的操作实现不同属性的过程。
此时你需要一个清晰的程序目录结构:
1 │ README #程序说明 2 ├─bin 3 │ main.py # 启动入口 4 ├─core # 核心代码 5 │ │ admin_view.py # 学校\管理视图 6 │ │ data_deal.py # 数据的增删改查实现 7 │ │ edu_class.py #学校,学生,教师,课程,班级 8 │ │ student_view.py # 学生视图 9 │ │ teacher_view.py # 老师视图 10 └─datas 11 datas.pk #日志文件
接下来为你端上每个源程序的代码:
1 ''' 2 启动程序 3 ''' 4 import os 5 import sys 6 7 # 导入路径 8 BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 9 sys.path.append(BASE_PATH) 10 print(BASE_PATH) 11 '''从核心代码core中导入三种视图''' 12 from core import admin_view 13 from core import student_view 14 from core import teacher_view 15 16 17 def main(): 18 print("*"*50) 19 choice = input("请输入角色:1 学校\t2 教师\t3 学生\n->") 20 print("*" * 50) 21 if choice == '1': 22 admin_view.run() 23 elif choice == '2': 24 teacher_view.run() 25 elif choice == '3': 26 student_view.run() 27 elif choice == '0': 28 print("已退出程序!") 29 return 30 else: 31 print("输入错误!\n********************") 32 main() 33 34 if __name__ == "__main__": 35 main()
1 # 作者:周浩强 2 ''' 3 ---------管理员视图--------------- 4 功能: 5 将 --->讲师类、班级类、课程类 进行实例化 6 即:创建讲师, 创建班级,创建课程 7 ''' 8 import os 9 import sys 10 11 # 导入路径 12 BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 13 sys.path.append(BASE_PATH) 14 15 from core import edu_class 16 from core import data_deal 17 18 19 def ch_school(): 20 print("选择学校:") 21 data_deal.print_schools() 22 school_name = input("学校名:") 23 school = data_deal.get_school(school_name) 24 if school == None: 25 print("学校选择错误") 26 return 27 28 29 def ch_course(): 30 print("选择课程:") 31 data_deal.print_courses() 32 course_name = input("课程名:") 33 course = data_deal.get_course(course_name) 34 if course == None: 35 print("课程选择错误") 36 return 37 38 39 def ch_teacher(): 40 print("选择老师:") 41 data_deal.print_teachers() 42 teacher_name = input("老师姓名:") 43 teacher = data_deal.get_teacher(teacher_name) 44 if teacher == None: 45 print("老师选择错误") 46 return 47 48 49 def add_grade(): # 创建班级 50 print("请填写班级信息:") 51 grade_name = input("名称:") 52 ch_school() 53 ch_course() 54 ch_teacher() 55 grade = school.create_grade(grade_name, teacher, course) 56 data_deal.update_grade(grade) 57 data_deal.update_school(school) 58 59 60 def add_school(): # 创建学校 61 print("请填写学校信息:") 62 school_name = input("名称:") 63 address = input("地址:") 64 school = edu_class.School(school_name, address) 65 data_deal.update_school(school) 66 67 68 def add_course(): # 创建课程:linux , python , go 3个 linux\py 在北京开, go 在上海开 69 print("请填写课程信息:") 70 course_name = input("名称:") 71 cycle = input("周期:") 72 price = input("学费:") 73 ch_school() 74 course = school.create_course(course_name, cycle, price) 75 data_deal.update_course(course) 76 data_deal.update_school(school) 77 78 79 def add_teacher(): # 创建老师 80 print("请填写教师信息:") 81 teacher_name = input("姓名:") 82 ch_school() 83 teacher = school.create_teacher(teacher_name) 84 data_deal.update_teacher(teacher) 85 data_deal.update_school(school) 86 print("老师 %s 创建成功!" % teacher.name) 87 88 89 def show_schools(): 90 data_deal.print_schools() 91 92 93 def show_courses(): 94 data_deal.print_courses() 95 96 97 def show_teachers(): 98 data_deal.print_teachers() 99 100 101 def show_grades(): 102 data_deal.print_grades() 103 104 105 def show_teacher(): 106 ch_teacher() 107 teacher.show_info() 108 109 110 def run(): 111 print("\t学校视图\n","=" * 20) 112 while True: 113 print("1.增加学校\t2.增加老师\t3.增加课程\t4.增加班级\t" 114 "5.查看学校\n6.查看老师\t7.查看课程\t8.查看班级\t" 115 "9.查看教师详细\t" 116 "0.退出") 117 res = input("输入序号:") 118 if res == "1": 119 add_school() 120 elif res == "2": 121 add_teacher() 122 elif res == "3": 123 add_course() 124 elif res == "4": 125 add_grade() 126 elif res == "5": 127 show_schools() 128 elif res == "6": 129 show_teachers() 130 elif res == "7": 131 show_courses() 132 elif res == "8": 133 show_grades() 134 elif res == "9": 135 show_teacher() 136 elif res == "0": 137 print("退出成功!") 138 break 139 else: 140 print("请选择正确的编号") 141 142 143 if __name__ == "__main__": 144 run()
1 # 作者:周浩强 2 ''' 3 ---------学生视图--------------- 4 功能: 5 将----->学生类实例化,交学费,选择班级 6 ''' 7 import os 8 import sys 9 10 # 导入路径 11 BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 12 sys.path.append(BASE_PATH) 13 14 from core import edu_class 15 from core import data_deal 16 17 18 # 选择函数集 19 def ch_school(): 20 print("选择学校:") 21 data_deal.print_schools() 22 school_name = input("学校名:") 23 school = data_deal.get_school(school_name) 24 if school == None: 25 print("学校选择错误") 26 return 27 28 29 def ch_course(): 30 print("选择课程:") 31 data_deal.print_courses() 32 course_name = input("课程名:") 33 course = data_deal.get_course(course_name) 34 if course == None: 35 print("课程选择错误") 36 return 37 38 39 def ch_teacher(): 40 print("选择老师:") 41 data_deal.print_teachers() 42 teacher_name = input("老师姓名:") 43 teacher = data_deal.get_teacher(teacher_name) 44 if teacher == None: 45 print("老师选择错误") 46 return 47 48 49 def ch_grade(): 50 print("选择班级:") 51 data_deal.print_grades() 52 grade_name = input("班级名:") 53 grade = data_deal.get_grade(grade_name) 54 if grade == None: 55 print("班级选择错误") 56 return 57 58 59 def ch_student(): 60 print("选择学生:") 61 data_deal.print_students() 62 student_name = input("学生名:") 63 student = data_deal.get_student(student_name) 64 if student == None: 65 print("学生选择错误") 66 return 67 68 69 # 学生视图函数集 70 def add_student(): 71 print("请填写学生信息:") 72 name = input("姓名:") 73 ch_school() 74 ch_grade() 75 student = edu_class.Student(name, school, grade) 76 data_deal.update_student(student) 77 data_deal.update_school(school) 78 data_deal.update_grade(grade) 79 80 81 def pay_tuition(): 82 ch_student() 83 money = input("请输入学费金额:") 84 if not money.isdigit(): 85 print("输入金额格式不正确") 86 return 87 student.pay_tuition(int(money)) 88 data_deal.update_student(student) 89 90 91 def choose_grade(): 92 ch_student() 93 ch_grade() 94 student.choose_grade(grade) 95 data_deal.update_student(student) 96 data_deal.update_grade(grade) 97 98 99 def choose_school(): 100 ch_student() 101 ch_school() 102 student.choose_school(school) 103 data_deal.update_student(student) 104 data_deal.update_school(school) 105 106 107 def show_student(): 108 ch_student() 109 student.show_info() 110 111 112 def show_students(): 113 data_deal.print_students() 114 115 116 def run(): 117 print("学生视图:") 118 print("=" * 20) 119 while True: 120 print("1.增加学生\t2.交学费\t3.选择班级\t4.选择学校\t" 121 "5.查看学生\t6.查看详细\t" 122 "0.退出") 123 res = input("输入序号:") 124 if res == "1": 125 add_student() 126 elif res == "2": 127 pay_tuition() 128 elif res == "3": 129 choose_grade() 130 elif res == "4": 131 choose_school() 132 elif res == "5": 133 show_students() 134 elif res == "6": 135 show_student() 136 elif res == "0": 137 print("退出成功!") 138 break 139 else: 140 print("请选择正确的编号") 141 142 143 if __name__ == "__main__": 144 run()
1 # 作者:周浩强 2 ''' 3 ---------讲师视图--------------- 4 功能: 5 讲师可管理自己的班级, 上课时选择班级, 6 查看班级学员列表 , 修改所管理的学员的成绩 7 即:调用data_deal模块的功能 8 ''' 9 import os 10 import sys 11 12 # 导入路径 13 BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 14 sys.path.append(BASE_PATH) 15 16 from core import edu_class 17 from core import data_deal 18 19 20 # 选择函数集 21 def ch_school(): 22 print("选择学校:") 23 data_deal.print_schools() 24 school_name = input("学校名:") 25 school = data_deal.get_school(school_name) 26 if school == None: 27 print("学校选择错误") 28 return 29 30 31 def ch_course(): 32 print("选择课程:") 33 data_deal.print_courses() 34 course_name = input("课程名:") 35 course = data_deal.get_course(course_name) 36 if course == None: 37 print("课程选择错误") 38 return 39 40 41 def ch_teacher(): 42 print("选择老师:") 43 data_deal.print_teachers() 44 teacher_name = input("老师姓名:") 45 teacher = data_deal.get_teacher(teacher_name) 46 if teacher == None: 47 print("老师选择错误") 48 return 49 50 51 def ch_grade(): 52 print("选择班级:") 53 data_deal.print_grades() 54 grade_name = input("班级名:") 55 grade = data_deal.get_grade(grade_name) 56 if grade == None: 57 print("班级选择错误") 58 return 59 60 61 def ch_student(): 62 print("选择学生:") 63 data_deal.print_students() 64 student_name = input("学生名:") 65 student = data_deal.get_student(student_name) 66 if student == None: 67 print("学生选择错误") 68 return 69 70 71 # 教师视图函数集 72 def choose_grade(): 73 ch_teacher() 74 ch_grade() 75 teacher.choose_grade(grade) 76 data_deal.update_teacher(teacher) 77 78 79 def show_students(): 80 ch_teacher() 81 teacher.show_students() 82 83 84 def modify_score(): 85 ch_teacher() 86 ch_student() 87 score = input("请输入分数:") 88 if not score.isdigit() or 0 > int(score) or int(score) > 100: 89 print("输入分数不正确") 90 return 91 92 teacher.modify_score(student, score) 93 data_deal.update_teacher(teacher) 94 data_deal.update_student(student) 95 data_deal.update_grade(teacher.grade) 96 print("%s 的成绩修改为: %s" % (student.name, data_deal.get_student(student_name).score)) 97 98 99 def show_teacher(): 100 ch_teacher() 101 teacher.show_info() 102 103 104 def run(): 105 print("教师视图:") 106 print("=" * 20) 107 while True: 108 print("1.选择班级\t2.查看学生\t3.修改成绩\t4.查看教师\t0.退出") 109 res = input("输入序号:") 110 111 if res == "1": 112 choose_grade() 113 elif res == "2": 114 show_students() 115 elif res == "3": 116 modify_score() 117 elif res == "4": 118 show_teacher() 119 elif res == "0": 120 print("退出成功!") 121 break 122 else: 123 print("请选择正确的编号") 124 125 126 if __name__ == "__main__": 127 run()
1 # 作者:周浩强 2 3 # 处理高层业务逻辑 4 5 class Education(object): 6 def __init__(self, name): 7 self.name = name 8 9 def show(self): 10 pass 11 12 def __str__(self): 13 return self.name 14 15 16 class School(Education, object): 17 '''学校类''' 18 19 def __init__(self, name, address): 20 super(School, self).__init__(name) 21 self.address = address 22 self.teachers = [] 23 self.students = [] 24 self.courses = [] 25 self.grades = [] 26 print("school:%s 创建成功" % name) 27 28 def enroll(self, student): # 学员注册 29 self.students.append(student) 30 print("%s 注册在 %s" % (student.name, self.name)) 31 32 def leave_schol(self, student): # 学员退学 33 self.students.remove(student) 34 print("%s 从 %s 退学" % (student.name, self.name)) 35 36 def create_course(self, name, cycle, price): # 创建课程 37 '''通过学校创建课程,课程包含:周期、价格''' 38 course = Course(name, cycle, price) 39 self.courses.append(course) 40 print("course: %s 创建成功" % name) 41 return course 42 43 def create_teacher(self, name): 44 teacher = Teacher(name, self) 45 self.teachers.append(teacher) 46 print("teacher: %s 创建成功" % name) 47 return teacher 48 49 def hire_teacher(self, teacher): 50 self.teachers.append(teacher) 51 print("teacher: %s 雇佣成功" % teacher.name) 52 53 def fire_teacher(self, teacher): 54 self.teachers.remove(teacher) 55 print("teacher: %s 从 %s 移除" % (teacher.name, self.name)) 56 57 def create_grade(self, name, teacher, course): 58 '''学校创建班级,班级关联教师和课程''' 59 grade = Grade(name, teacher, course) 60 self.grades.append(grade) 61 print("grade: %s 创建成功" % name) 62 return grade 63 64 65 class Course(Education, object): 66 '''创建课程''' 67 68 def __init__(self, name, cycle, price): 69 super(Course, self).__init__(name) 70 self.cycle = cycle 71 self.price = price 72 73 74 class Grade(Education, object): 75 '''创建班级''' 76 77 def __init__(self, name, teacher, course): 78 super(Grade, self).__init__(name) 79 self.teacher = teacher 80 self.course = course 81 self.students = [] 82 83 def enroll(self, student): # 学员注册 84 self.students.append(student) 85 print("%s enroll in %s " % (student.name, self.name)) 86 87 def leave_grade(self, student): # 学员离开 88 self.students.remove(student) 89 print("%s leave grade from %s " % (student.name, self.name)) 90 91 def show_info(self): 92 print("grade:name: %s\t teacher:%s\t course:%s\t students:%s" % 93 (self.name, self.teacher, self.course, self.students)) 94 95 96 class Teacher(Education, object): 97 '''创建老师''' 98 99 def __init__(self, name, school): 100 super(Teacher, self).__init__(name) 101 self.school = None # 为None时表示未选择学校 102 self.choose_school(school) 103 self.grade = None # 为None时表示未选择班级 104 105 def choose_school(self, school): 106 if self.school != None: 107 self.school.fire_teacher(self) 108 school.hire_teacher(self) 109 self.school = school 110 111 def choose_grade(self, grade): 112 self.grade = grade 113 114 def show_students(self): 115 if self.grade != None: 116 for student in self.grade.students: 117 student.show_info() 118 else: 119 print("请选择班级") 120 121 def modify_score(self, student, score): 122 student.score = score 123 124 def show_info(self): 125 print("teacher:name:%s\t school:%s\t grade:%s" 126 % (self.name, self.school, self.grade)) 127 128 129 class Student(Education, object): 130 '''创建学员时,选择学校,关联班级''' 131 132 def __init__(self, name, school, grade, score=0): 133 super(Student, self).__init__(name) 134 self.score = score 135 self.school = None 136 self.grade = None 137 self.tuition = 0 138 self.choose_school(school) 139 self.choose_grade(grade) 140 141 def choose_school(self, school): 142 if self.school != None: 143 self.school.leave_school(self) 144 school.enroll(self) 145 self.school = school 146 147 def choose_grade(self, grade): 148 if self.grade != None: 149 self.grade.leave_grade(self) 150 grade.enroll(self) 151 self.grade = grade 152 153 def pay_tuition(self, money): # 交学费 154 self.tuition += money 155 156 def show_info(self): 157 print("student:name: %s\t school:%s\t grade:%s\t score:%s\t tuition:%s" 158 % (self.name, self.school, self.grade, self.score, self.tuition)) 159 160 161 if __name__ == "__main__": 162 school = School("淮南师范学院", "淮南") 163 teacher = school.create_teacher("王老师") 164 course = school.create_course("通信", "1年", 5000) 165 grade = school.create_grade("大三", teacher, course) 166 student = Student("Tom", school, grade) 167 student.show_info() 168 teacher.modify_score(student, 64) 169 teacher.show_info() 170 student.show_info()
1 # 作者:周浩强 2 ''' 3 功能:处理数据存储与提取,数据的增删改查实现 4 ''' 5 6 import pickle 7 8 path = "../datas/datas.pk" # 数据路径 9 10 11 def dump(obj): 12 f = open(path, "wb") 13 pickle.dump(obj, f) 14 f.close() 15 16 17 def load(): 18 f = open(path, "rb") 19 infos = pickle.load(f) 20 f.close() 21 return infos 22 23 24 def print_all_info(): # 打印数据信息 25 infos = load() 26 print("=" * 50) 27 for key in infos: 28 print(key, ":") 29 for key2 in infos.get(key): 30 print("\t", key2, ":", infos.get(key).get(key2)) 31 print("=" * 50) 32 33 34 def print_infos(key): 35 infos = load() 36 print(key.center(50, "=")) 37 # print("\t", "名称", ":", key) 38 print("\t", "-" * 30) 39 for key2 in infos.get(key): 40 print("\t", key, ":", infos.get(key).get(key2)) 41 print("=" * 50) 42 43 44 def print_schools(): 45 key = "schools" 46 print_infos(key) 47 48 49 def print_courses(): 50 key = "courses" 51 print_infos(key) 52 53 54 def print_grades(): 55 key = "grades" 56 print_infos(key) 57 58 59 def print_teachers(): 60 key = "teachers" 61 print_infos(key) 62 63 64 def print_students(): 65 key = "students" 66 print_infos(key) 67 68 69 # 查询操作 70 def get_infos(class_name): 71 infos = load() 72 return infos.get(class_name) 73 74 75 # 查询学校 76 def get_schools(): 77 return get_infos("schools") 78 79 80 def get_school(school_name): 81 return get_schools().get(school_name) 82 83 84 # 查询班级 85 def get_grades(): 86 return get_infos("grades") 87 88 89 def get_grade(grade_name): 90 return get_grades().get(grade_name) 91 92 93 # 查询课程 94 def get_courses(): 95 return get_infos("courses") 96 97 98 def get_course(course_name): 99 return get_courses().get(course_name) 100 101 102 # 查询老师 103 def get_teachers(): 104 return get_infos("teachers") 105 106 107 def get_teacher(teacher_name): 108 return get_teachers().get(teacher_name) 109 110 111 # 查询学生 112 def get_students(): 113 return get_infos("students") 114 115 116 def get_student(student_name): 117 return get_students().get(student_name) 118 119 120 # 修改操作 121 def update(dct): 122 obj = load() 123 obj.update(dct) 124 dump(obj) 125 126 127 def update_school(school): 128 infos = load() 129 infos["schools"].update({school.name: school}) 130 dump(infos) 131 132 133 def update_course(course): 134 infos = load() 135 infos["courses"].update({course.name: course}) 136 dump(infos) 137 138 139 def update_grade(grade): 140 infos = load() 141 infos["grades"].update({grade.name: grade}) 142 dump(infos) 143 144 145 def update_teacher(teacher): 146 infos = load() 147 infos["teachers"].update({teacher.name: teacher}) 148 dump(infos) 149 150 151 def update_student(student): 152 infos = load() 153 infos["students"].update({student.name: student}) 154 dump(infos) 155 156 157 def init(): 158 # 存储结构 159 infos = { 160 "schools": { 161 # "school_name": "school_obj" 162 }, 163 "grades": { 164 # "grade_name": "grade_obj" 165 }, 166 "courses": { 167 # "course_name": "course_obj" 168 }, 169 "teachers": { 170 # "teacher_name": "teacher_obj" 171 }, 172 "students": { 173 # "student_name": "student_obj" 174 }, 175 } 176 # 初始化数据 177 res = input("是否初始化数据?[y]:") 178 if res == "y": 179 dump(infos) 180 print("数据初始化成功!") 181 else: 182 print("数据初始化失败!") 183 184 185 if __name__ == '__main__': 186 init()
运行截图


浙公网安备 33010602011771号