python实现学生选课系统 面向对象的应用:
一、要求: 选课系统
管理员:
创建老师:姓名、性别、年龄、资产
创建课程:课程名称、上课时间、课时费、关联老师
使用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
- import os
- BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #配置文件的上级目录
- BASE_ADMIN_DIR = os.path.join(BASE_DIR, "db", "admin") #管理员目录
- BASE_STUDENTS_DIR = os.path.join(BASE_DIR, "db", "students") #学生目录
- TEACHER_DB_DIR = os.path.join(BASE_DIR, "db", "teacher_list") #老师列表目录
- COURSE_DB_DIR = os.path.join(BASE_DIR, "db", "course_list") #课程列表目录
4.2公共模块modules.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- import random
- import time
- import pickle
- from config import settings
- import os
- class Teacher:
- """
- 封装老师的相关信息
- """
- def __init__(self, name, age, admin):
- self.name = name
- self.age = age
- self.__assets = 0
- self.create_time = time.strftime('%Y-%m-%d %H:%M:%S')
- self.create_admin = admin
- def gain(self, cost):
- """
- 增加资产
- :param cost: 增加的数量
- :return:
- """
- self.__assets += cost
- def decrease(self, cost):
- """
- 减少资产
- :param cost: 减少的数量
- :return:
- """
- self.__assets -= cost
- class Course:
- """
- 课程相关信息
- """
- def __init__(self, course_name, cost, teacher_obj, admin):
- self.course_name = course_name
- self.cost = cost
- self.teacher = teacher_obj
- self.create_time = time.strftime('%Y-%m-%d %H:%M:%S')
- self.create_admin = admin
- def have_lesson(self):
- """
- 课程上课,自动给相关联的任课老师增加课时费
- :return: 课程内容返回给上课者
- """
- self.teacher.gain(self.cost)
- content = random.randrange(10, 100)
- r = time.strftime('%Y-%m-%d %H:%M:%S')
- temp = "课程:%s;老师:%s;内容:%d;时间:%f" % (self.course_name, self.teacher, content, r)
- return temp
- def absence(self):
- """
- 教学事故
- :return:
- """
- self.teacher.decrease(self.cost * 2)
- class Admin:
- def __init__(self):
- self.username = None
- self.password = None
- def login(self, user, pwd):
- """
- 管理员登陆
- :param user:
- :param pwd:
- :return:
- """
- if self.username == user and self.password == pwd:
- return True
- else:
- return False
- def register(self, user, pwd):
- """
- 管理员注册
- :param user:
- :param pwd:
- :return:
- """
- self.username = user
- self.password = pwd
- path = os.path.join(settings.BASE_ADMIN_DIR, self.username) #管理员目录
- pickle.dump(self, open(path, 'xb')) #将管理员对象写入文件
- class Student:
- """
- 学生相关信息
- """
- def __init__(self):
- self.username = None
- self.password = None
- self.course_list = []
- self.study_dict = {}
- def select_course(self, course_obj):
- """
- 学生选课
- :param course_obj:
- :return:
- """
- self.course_list.append(course_obj) #将课程对象添加进课程列表
- def study(self, course_obj):
- """
- 学生上课
- :param course_obj:
- :return:
- """
- class_result = course_obj.have_lesson() #获取学生上课信息
- if course_obj in self.study_dict.keys(): #key:课程对象 value:上课信息列表,是列表格式
- self.study_dict[course_obj].append(class_result) #将上课信息列表添加进上一次的列表中
- else:
- self.study_dict[course_obj] = [class_result, ] #创建该课程对象的键值对
- def login(self, user, pwd):
- """
- 学生登陆
- :param user:
- :param pwd:
- :return:
- """
- if self.username == user and self.password == pwd:
- return True
- else:
- return False
- def register(self, user, pwd):
- """
- 学生注册
- :param user:
- :param pwd:
- :return:
- """
- self.username = user
- self.password = pwd
- path = os.path.join(settings.BASE_STUDENTS_DIR, self.username) #学生目录
- pickle.dump(self, open(path, 'xb')) #将学生对象写入学生目录
4.3管理员文件administrator.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- import os
- import sys
- sys.path.append(os.path.dirname(os.path.dirname(__file__)))
- import random
- import time
- import pickle
- import os
- from lib import models
- from config import settings
- from lib.models import *
- def create_course(admin_obj):
- teacher_list = pickle.load(open(settings.TEACHER_DB_DIR, 'rb')) #读取老师清单
- for num, item in enumerate(teacher_list, 1): #打印老师清单
- print(num, item.name,item.age,item.create_time,item.create_admin.username)
- course_list = [] #创建课程列表
- while True:
- name = input('请输入课程名称(q退出):')
- if name == 'q':
- break
- cost = input('请输入课时费:')
- num = input('选择老师(序号):')
- obj = models.Course(name, cost, teacher_list[int(num)-1], admin_obj) #创建课程对象
- course_list.append(obj)
- if os.path.exists(settings.COURSE_DB_DIR): #如果有课程列表
- exists_list = pickle.load(open(settings.COURSE_DB_DIR, 'rb'))
- course_list.extend(exists_list) #对原有课程列表进行扩展
- pickle.dump(course_list, open(settings.COURSE_DB_DIR, 'wb')) #将学生列表写入文件
- def create_teacher(admin_obj):
- teacher_list = [] #创建老师列表
- while True:
- teacher_name = input('请输入老师姓名(q表示退出)')
- if teacher_name == 'q':
- break
- teacher_age = input('请输入老师年龄')
- obj = models.Teacher(teacher_name, teacher_age, admin_obj) #创建老师对象
- teacher_list.append(obj)
- if os.path.exists(settings.TEACHER_DB_DIR):
- exists_list = pickle.load(open(settings.TEACHER_DB_DIR, 'rb'))
- teacher_list.extend(exists_list) #对原有老师列表进行扩展
- pickle.dump(teacher_list, open(settings.TEACHER_DB_DIR, 'wb')) #将老师列表写入文件
- def login(user,pwd):
- if os.path.exists(os.path.join(settings.BASE_ADMIN_DIR, user)):
- # 从文件中将管理员对象读取出来(里面封装了用户信息以及提供了登录方法)
- admin_obj = pickle.load(open(os.path.join(settings.BASE_ADMIN_DIR, user), 'rb'))
- if admin_obj.login(user, pwd):
- print('登录成功')
- while True:
- sel = input("1、创建老师;2、创建课程")
- if sel == '1':
- create_teacher(admin_obj)
- elif sel == '2':
- create_course(admin_obj)
- else:
- break
- else:
- return 1
- else:
- return 0
- def regiter(user,pwd):
- admin_obj = models.Admin()
- admin_obj.register(user, pwd)
- def main():
- inp = input("1、管理员登录;2、管理员注册;\n >>>")
- user = input('请输入用户名:')
- pwd = input('请输入密码:')
- if inp == '1':
- ret = login(user, pwd)
- if ret == 1:
- print('密码错误')
- elif ret == 0:
- print('用户不存在')
- elif inp == '2':
- regiter(user, pwd)
- if __name__ == "__main__":
- main()
4.4学生文件students.py
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- import os
- import sys
- sys.path.append(os.path.dirname(os.path.dirname(__file__)))
- import pickle
- from lib import models
- from config import settings
- from lib.models import Course
- from lib.models import Admin
- from lib.models import Teacher
- def course_info(student_obj): #打印已选课程信息
- for item in student_obj.course_list:
- print(item.course_name, item.teacher.name)
- def select_course(student_obj): #选择课程
- course_list = pickle.load(open(settings.COURSE_DB_DIR, 'rb')) #从文件读取课程
- for num, item in enumerate(course_list, 1):
- print(num, item.course_name, item.cost, item.teacher.name) #打印课程列表
- while True:
- num = input("请选择课程(q退出):")
- if num == "q":
- break;
- selected_course_obj = course_list[int(num)-1] #根据序号选择课程
- if selected_course_obj not in student_obj.course_list:
- student_obj.course_list.append(selected_course_obj) #添加进该学生的课程列表
- pickle.dump(student_obj, open(os.path.join(settings.BASE_STUDENTS_DIR, student_obj.username), 'wb'))#将学生对象dump进文件,封装学生选课列表,上课字典信息
- def login(user, pwd):
- if os.path.exists(os.path.join(settings.BASE_STUDENTS_DIR, user)):
- student_obj = pickle.load(open(os.path.join(settings.BASE_STUDENTS_DIR, user), 'rb'))
- if student_obj.login(user,pwd): #如果登陆成功
- while True:
- inp = input('1、选课;2、上课;3、查看课程信息')
- if inp == '1':
- select_course(student_obj)
- elif inp == '3':
- course_info(student_obj)
- else:
- break
- else:
- print('密码错误')
- else:
- print('用户不存在')
- def register(user, pwd):
- obj = models.Student()
- obj.register(user,pwd)
- def main():
- inp = input('1、登录;2、注册 \n >>>')
- user = input("用户名:")
- pwd = input("密码:")
- if inp == "1":
- login(user,pwd)
- elif inp == "2":
- register(user, pwd)
- if __name__ == "__main__":
- main()
python实现学生选课系统 面向对象的应用:的更多相关文章
- python基础-10 程序目录结构 学生选课系统面向对象练习
一 程序目录结构 1 bin文件夹 二进制文件.代码程序 2 conf 配置文件 3 帮助文档 4 头文件库文件等 二 学生选课系统部分代码 未完待续 1 包内的__init__.py文件 在包 ...
- python开发项目:学生选课系统
程序要求:1.创建北京.上海两所学校(分析:通过学校类实例化两个学校实例) 2.创建Linux.python.go三个课程,Linux\go在北京开,Linux在上海开(创建Linux.python. ...
- Java项目实例之---学生选课(面向对象复习)
学生选课(面向对象复习) 设计一个学生选课的程序,分别有学生类(Student)和课程类(Course) 学生类的属性有:学号(String),姓名(String),性别(char),所选科目(Cou ...
- 学生选课系统 c语言
/********************************* *主题:学生选修课程系统设计 * *设计要求: *1.添加功能:程序能够任意添加课程和学生记录,可提供选择界面供用户选择所需要添加 ...
- JAVA | 学生选课系统
这里使用JAVA语言编写的简易的学生选课系统,展现的都是这个系统核心代码. 其中有不足欢迎批评和指正! 链接数据库的代码 package connection;//连接数据库student impor ...
- 学生选课系统v1.0
最近两天写了下老师课上留的作业:学生选课系统.感觉自己写的特别麻烦,思路特别不清晰,平常自己总会偷懒,一些太麻烦细节的功能就不去实现了,用简单的功能来替代,直到自己这回写完这个系统(但自己写的比较lo ...
- java web知识点复习,重新编写学生选课系统的先关操作。
为了复习之前学习的相关的html,javaweb等知识.自己有重新编写了一遍学生选课系统. 下面主要展示登录界面的代码,以及各个大的主页面的相关jsp. <%@ page language=&q ...
- [ python ] 作业:选课系统
功能代码实现源地址:https://www.cnblogs.com/lianzhilei/p/5832691.html 如有侵权,立即删除 本文主要是分析 选课系统 实现思路及上面代码的实现过程 ...
- python--面向对象编程之学生选课系统练习
1.系统目录结构 文件夹注解: bin--系统管理员和学生的主程序代码 config--系统的配置文件 db--系统的数据文件 admin--管理员的数据文件 student--学生的数据文件 lib ...
随机推荐
- 校赛E题递归形式
#include<stdio.h> #include<string.h> using namespace std; typedef long long ll; ][]; ,,, ...
- django的前后的结合,search搜索功能案例
利用django的Q()功能可以很好的展开搜索功能 假设我要做个这样的搜索功能
- vmware-question
1.网卡修改序号ip link set eth3 name eth02.解决克隆虚拟机后网卡设备无法识别启动问题的方法******************************/etc/udev/r ...
- close与shutdown函数
linux网络编程之socket(十):shutdown 与 close 函数的区别 http://blog.csdn.net/yijiu0711/article/details/17349169 ...
- Linux-PAM认证模块
Linux-PAM认证模块 用户访问服务器的时候,服务器的某一个服务程序把用户的谁请求发送到PAM模块进行认证.对于不同的服务器应用程序所对应的PAM模块也是不同的.如果想查看某个程序是否支持 ...
- php优化
2015年12月14日 21:20:29 之前写过两篇文章: xdebug配置 xdebug trace 结果分析 第二篇里边有两个很耗时间和内存的线条: 第一个斜坡: 从mysql里读取数据后, 用 ...
- Qt 常用的功能
1.程序重启 void Widget::reStart() { qApp->closeAllWindows(); QProcess::startDetached(qApp->appli ...
- 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 ...
- LAMP 之 mysql 安装
搞了成日 = = 呢个野.... 大部分东西写在 印象笔记 中....不过呢个野特别繁琐,所以记录落黎(小白一枚,大家见谅) 总结下,唔系好容易唔记得 >W< (可能唔会甘完整,我将我自认 ...
- Spring JMS ActiveMQ整合(转)
转载自:http://my.oschina.net/xiaoxishan/blog/381209#comment-list ActiveMQ学习笔记(四)http://my.oschina.net/x ...