一、要求: 选课系统

管理员:
创建老师:姓名、性别、年龄、资产
创建课程:课程名称、上课时间、课时费、关联老师
使用pickle保存在文件

学生:
学生:用户名、密码、性别、年龄、选课列表[]、上课记录{课程1:【di,a,】}
1、列举所有课程
2、选择课程
3、学生上课,
4、ret = 课程.work() 获取课程的返回; 资产+=课时费

二、代码思路

1.类的关联:

a、Teacher类:关联管理员,由哪个管理员创建

b、 Course类:关联老师对象、管理员对象(注意:关联的是对象)

2.文件的写入:

a、管理员文件:写入的是管理员对象(封装管理员的用户名和密码)

b、学生文件:写入的是学生对象(封装了学生已选课程列表,已经上过的课程字典:key:课程对象 value:上课信息列表,是列表格式)

c、课程列表course_list、老师列表teacher_lis,都是列表格式。

三、文件概述

bin目录:存放administrator.py文件和students.py文件

config目录:存放settings.py文件,即配置文件

db目录:存放与数据相关的文件,包括课程列表course_list、老师列表teacher_list、学生文件夹、管理员文件夹

lib目录:存放models.py文件,即存放公共的模块

log目录:存放日志文件

四、代码实现

4.1 配置文件settings.py

  1. import os
  2. BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #配置文件的上级目录
  3.  
  4. BASE_ADMIN_DIR = os.path.join(BASE_DIR, "db", "admin") #管理员目录
  5.  
  6. BASE_STUDENTS_DIR = os.path.join(BASE_DIR, "db", "students") #学生目录
  7.  
  8. TEACHER_DB_DIR = os.path.join(BASE_DIR, "db", "teacher_list") #老师列表目录
  9.  
  10. COURSE_DB_DIR = os.path.join(BASE_DIR, "db", "course_list") #课程列表目录

4.2公共模块modules.py

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import random
  4. import time
  5. import pickle
  6. from config import settings
  7. import os
  8. class Teacher:
  9. """
  10. 封装老师的相关信息
  11. """
  12. def __init__(self, name, age, admin):
  13. self.name = name
  14. self.age = age
  15. self.__assets = 0
  16. self.create_time = time.strftime('%Y-%m-%d %H:%M:%S')
  17. self.create_admin = admin
  18.  
  19. def gain(self, cost):
  20. """
  21. 增加资产
  22. :param cost: 增加的数量
  23. :return:
  24. """
  25. self.__assets += cost
  26.  
  27. def decrease(self, cost):
  28. """
  29. 减少资产
  30. :param cost: 减少的数量
  31. :return:
  32. """
  33. self.__assets -= cost
  34.  
  35. class Course:
  36. """
  37. 课程相关信息
  38. """
  39. def __init__(self, course_name, cost, teacher_obj, admin):
  40. self.course_name = course_name
  41. self.cost = cost
  42. self.teacher = teacher_obj
  43. self.create_time = time.strftime('%Y-%m-%d %H:%M:%S')
  44. self.create_admin = admin
  45.  
  46. def have_lesson(self):
  47. """
  48. 课程上课,自动给相关联的任课老师增加课时费
  49. :return: 课程内容返回给上课者
  50. """
  51. self.teacher.gain(self.cost)
  52.  
  53. content = random.randrange(10, 100)
  54. r = time.strftime('%Y-%m-%d %H:%M:%S')
  55. temp = "课程:%s;老师:%s;内容:%d;时间:%f" % (self.course_name, self.teacher, content, r)
  56. return temp
  57.  
  58. def absence(self):
  59. """
  60. 教学事故
  61. :return:
  62. """
  63. self.teacher.decrease(self.cost * 2)
  64.  
  65. class Admin:
  66. def __init__(self):
  67. self.username = None
  68. self.password = None
  69.  
  70. def login(self, user, pwd):
  71. """
  72. 管理员登陆
  73. :param user:
  74. :param pwd:
  75. :return:
  76. """
  77. if self.username == user and self.password == pwd:
  78. return True
  79. else:
  80. return False
  81.  
  82. def register(self, user, pwd):
  83. """
  84. 管理员注册
  85. :param user:
  86. :param pwd:
  87. :return:
  88. """
  89. self.username = user
  90. self.password = pwd
  91.  
  92. path = os.path.join(settings.BASE_ADMIN_DIR, self.username) #管理员目录
  93. pickle.dump(self, open(path, 'xb')) #将管理员对象写入文件
  94.  
  95. class Student:
  96. """
  97. 学生相关信息
  98. """
  99. def __init__(self):
  100. self.username = None
  101. self.password = None
  102.  
  103. self.course_list = []
  104. self.study_dict = {}
  105.  
  106. def select_course(self, course_obj):
  107. """
  108. 学生选课
  109. :param course_obj:
  110. :return:
  111. """
  112. self.course_list.append(course_obj) #将课程对象添加进课程列表
  113.  
  114. def study(self, course_obj):
  115. """
  116. 学生上课
  117. :param course_obj:
  118. :return:
  119. """
  120. class_result = course_obj.have_lesson() #获取学生上课信息
  121.  
  122. if course_obj in self.study_dict.keys(): #key:课程对象 value:上课信息列表,是列表格式
  123.  
  124. self.study_dict[course_obj].append(class_result) #将上课信息列表添加进上一次的列表中
  125. else:
  126. self.study_dict[course_obj] = [class_result, ] #创建该课程对象的键值对
  127.  
  128. def login(self, user, pwd):
  129. """
  130. 学生登陆
  131. :param user:
  132. :param pwd:
  133. :return:
  134. """
  135. if self.username == user and self.password == pwd:
  136. return True
  137. else:
  138. return False
  139.  
  140. def register(self, user, pwd):
  141. """
  142. 学生注册
  143. :param user:
  144. :param pwd:
  145. :return:
  146. """
  147. self.username = user
  148. self.password = pwd
  149.  
  150. path = os.path.join(settings.BASE_STUDENTS_DIR, self.username) #学生目录
  151. pickle.dump(self, open(path, 'xb')) #将学生对象写入学生目录

4.3管理员文件administrator.py

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import os
  4. import sys
  5. sys.path.append(os.path.dirname(os.path.dirname(__file__)))
  6.  
  7. import random
  8. import time
  9. import pickle
  10. import os
  11. from lib import models
  12. from config import settings
  13. from lib.models import *
  14.  
  15. def create_course(admin_obj):
  16. teacher_list = pickle.load(open(settings.TEACHER_DB_DIR, 'rb')) #读取老师清单
  17. for num, item in enumerate(teacher_list, 1): #打印老师清单
  18. print(num, item.name,item.age,item.create_time,item.create_admin.username)
  19. course_list = [] #创建课程列表
  20. while True:
  21. name = input('请输入课程名称(q退出):')
  22. if name == 'q':
  23. break
  24. cost = input('请输入课时费:')
  25. num = input('选择老师(序号):')
  26. obj = models.Course(name, cost, teacher_list[int(num)-1], admin_obj) #创建课程对象
  27. course_list.append(obj)
  28.  
  29. if os.path.exists(settings.COURSE_DB_DIR): #如果有课程列表
  30. exists_list = pickle.load(open(settings.COURSE_DB_DIR, 'rb'))
  31. course_list.extend(exists_list) #对原有课程列表进行扩展
  32. pickle.dump(course_list, open(settings.COURSE_DB_DIR, 'wb')) #将学生列表写入文件
  33.  
  34. def create_teacher(admin_obj):
  35. teacher_list = [] #创建老师列表
  36. while True:
  37. teacher_name = input('请输入老师姓名(q表示退出)')
  38. if teacher_name == 'q':
  39. break
  40. teacher_age = input('请输入老师年龄')
  41. obj = models.Teacher(teacher_name, teacher_age, admin_obj) #创建老师对象
  42. teacher_list.append(obj)
  43. if os.path.exists(settings.TEACHER_DB_DIR):
  44. exists_list = pickle.load(open(settings.TEACHER_DB_DIR, 'rb'))
  45. teacher_list.extend(exists_list) #对原有老师列表进行扩展
  46. pickle.dump(teacher_list, open(settings.TEACHER_DB_DIR, 'wb')) #将老师列表写入文件
  47.  
  48. def login(user,pwd):
  49. if os.path.exists(os.path.join(settings.BASE_ADMIN_DIR, user)):
  50. # 从文件中将管理员对象读取出来(里面封装了用户信息以及提供了登录方法)
  51. admin_obj = pickle.load(open(os.path.join(settings.BASE_ADMIN_DIR, user), 'rb'))
  52. if admin_obj.login(user, pwd):
  53. print('登录成功')
  54. while True:
  55. sel = input("1、创建老师;2、创建课程")
  56. if sel == '1':
  57. create_teacher(admin_obj)
  58. elif sel == '2':
  59. create_course(admin_obj)
  60. else:
  61. break
  62.  
  63. else:
  64. return 1
  65. else:
  66. return 0
  67.  
  68. def regiter(user,pwd):
  69. admin_obj = models.Admin()
  70. admin_obj.register(user, pwd)
  71.  
  72. def main():
  73. inp = input("1、管理员登录;2、管理员注册;\n >>>")
  74. user = input('请输入用户名:')
  75. pwd = input('请输入密码:')
  76.  
  77. if inp == '1':
  78. ret = login(user, pwd)
  79. if ret == 1:
  80. print('密码错误')
  81. elif ret == 0:
  82. print('用户不存在')
  83.  
  84. elif inp == '2':
  85. regiter(user, pwd)
  86.  
  87. if __name__ == "__main__":
  88. main()

4.4学生文件students.py

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import os
  4. import sys
  5. sys.path.append(os.path.dirname(os.path.dirname(__file__)))
  6. import pickle
  7. from lib import models
  8. from config import settings
  9. from lib.models import Course
  10. from lib.models import Admin
  11. from lib.models import Teacher
  12.  
  13. def course_info(student_obj): #打印已选课程信息
  14. for item in student_obj.course_list:
  15. print(item.course_name, item.teacher.name)
  16.  
  17. def select_course(student_obj): #选择课程
  18. course_list = pickle.load(open(settings.COURSE_DB_DIR, 'rb')) #从文件读取课程
  19. for num, item in enumerate(course_list, 1):
  20. print(num, item.course_name, item.cost, item.teacher.name) #打印课程列表
  21. while True:
  22. num = input("请选择课程(q退出):")
  23. if num == "q":
  24. break;
  25. selected_course_obj = course_list[int(num)-1] #根据序号选择课程
  26. if selected_course_obj not in student_obj.course_list:
  27. student_obj.course_list.append(selected_course_obj) #添加进该学生的课程列表
  28. pickle.dump(student_obj, open(os.path.join(settings.BASE_STUDENTS_DIR, student_obj.username), 'wb'))#将学生对象dump进文件,封装学生选课列表,上课字典信息
  29.  
  30. def login(user, pwd):
  31. if os.path.exists(os.path.join(settings.BASE_STUDENTS_DIR, user)):
  32. student_obj = pickle.load(open(os.path.join(settings.BASE_STUDENTS_DIR, user), 'rb'))
  33. if student_obj.login(user,pwd): #如果登陆成功
  34. while True:
  35. inp = input('1、选课;2、上课;3、查看课程信息')
  36. if inp == '1':
  37. select_course(student_obj)
  38. elif inp == '3':
  39. course_info(student_obj)
  40. else:
  41. break
  42. else:
  43. print('密码错误')
  44. else:
  45. print('用户不存在')
  46.  
  47. def register(user, pwd):
  48. obj = models.Student()
  49. obj.register(user,pwd)
  50.  
  51. def main():
  52. inp = input('1、登录;2、注册 \n >>>')
  53. user = input("用户名:")
  54. pwd = input("密码:")
  55. if inp == "1":
  56. login(user,pwd)
  57. elif inp == "2":
  58. register(user, pwd)
  59.  
  60. if __name__ == "__main__":
  61. main()

python实现学生选课系统 面向对象的应用:的更多相关文章

  1. python基础-10 程序目录结构 学生选课系统面向对象练习

    一 程序目录结构 1 bin文件夹 二进制文件.代码程序  2 conf 配置文件  3 帮助文档  4 头文件库文件等 二 学生选课系统部分代码 未完待续 1 包内的__init__.py文件 在包 ...

  2. python开发项目:学生选课系统

    程序要求:1.创建北京.上海两所学校(分析:通过学校类实例化两个学校实例) 2.创建Linux.python.go三个课程,Linux\go在北京开,Linux在上海开(创建Linux.python. ...

  3. Java项目实例之---学生选课(面向对象复习)

    学生选课(面向对象复习) 设计一个学生选课的程序,分别有学生类(Student)和课程类(Course) 学生类的属性有:学号(String),姓名(String),性别(char),所选科目(Cou ...

  4. 学生选课系统 c语言

    /********************************* *主题:学生选修课程系统设计 * *设计要求: *1.添加功能:程序能够任意添加课程和学生记录,可提供选择界面供用户选择所需要添加 ...

  5. JAVA | 学生选课系统

    这里使用JAVA语言编写的简易的学生选课系统,展现的都是这个系统核心代码. 其中有不足欢迎批评和指正! 链接数据库的代码 package connection;//连接数据库student impor ...

  6. 学生选课系统v1.0

    最近两天写了下老师课上留的作业:学生选课系统.感觉自己写的特别麻烦,思路特别不清晰,平常自己总会偷懒,一些太麻烦细节的功能就不去实现了,用简单的功能来替代,直到自己这回写完这个系统(但自己写的比较lo ...

  7. java web知识点复习,重新编写学生选课系统的先关操作。

    为了复习之前学习的相关的html,javaweb等知识.自己有重新编写了一遍学生选课系统. 下面主要展示登录界面的代码,以及各个大的主页面的相关jsp. <%@ page language=&q ...

  8. [ python ] 作业:选课系统

    功能代码实现源地址:https://www.cnblogs.com/lianzhilei/p/5832691.html    如有侵权,立即删除 本文主要是分析 选课系统 实现思路及上面代码的实现过程 ...

  9. python--面向对象编程之学生选课系统练习

    1.系统目录结构 文件夹注解: bin--系统管理员和学生的主程序代码 config--系统的配置文件 db--系统的数据文件 admin--管理员的数据文件 student--学生的数据文件 lib ...

随机推荐

  1. 校赛E题递归形式

    #include<stdio.h> #include<string.h> using namespace std; typedef long long ll; ][]; ,,, ...

  2. django的前后的结合,search搜索功能案例

    利用django的Q()功能可以很好的展开搜索功能 假设我要做个这样的搜索功能

  3. vmware-question

    1.网卡修改序号ip link set eth3 name eth02.解决克隆虚拟机后网卡设备无法识别启动问题的方法******************************/etc/udev/r ...

  4. close与shutdown函数

    linux网络编程之socket(十):shutdown 与 close 函数的区别  http://blog.csdn.net/yijiu0711/article/details/17349169 ...

  5. Linux-PAM认证模块

    Linux-PAM认证模块     用户访问服务器的时候,服务器的某一个服务程序把用户的谁请求发送到PAM模块进行认证.对于不同的服务器应用程序所对应的PAM模块也是不同的.如果想查看某个程序是否支持 ...

  6. php优化

    2015年12月14日 21:20:29 之前写过两篇文章: xdebug配置 xdebug trace 结果分析 第二篇里边有两个很耗时间和内存的线条: 第一个斜坡: 从mysql里读取数据后, 用 ...

  7. Qt 常用的功能

    1.程序重启 void Widget::reStart() {   qApp->closeAllWindows(); QProcess::startDetached(qApp->appli ...

  8. Mac Mysql mysql_secure_installation Error: Access denied for user 'root'@'localhost' (using password: YES)

    mysql由brew安装, 期间好像自动更新了一次 然后再次执行mysql_secure_installation, 输入root密码后报错, 重装mysql还是不行 Error: Access de ...

  9. LAMP 之 mysql 安装

    搞了成日 = = 呢个野.... 大部分东西写在 印象笔记 中....不过呢个野特别繁琐,所以记录落黎(小白一枚,大家见谅) 总结下,唔系好容易唔记得 >W< (可能唔会甘完整,我将我自认 ...

  10. Spring JMS ActiveMQ整合(转)

    转载自:http://my.oschina.net/xiaoxishan/blog/381209#comment-list ActiveMQ学习笔记(四)http://my.oschina.net/x ...