书上学不到的Python综合题目实战07之培训机构运营模拟仿真

需求 使用python面向对象思想,模拟仿真某培训机构运营整个过程 两个目的

综合运用学习过的知识点 运用面向对象思维解决实际问题 模拟培训机构,从招生,到开班,到学员学习课程,到学员毕业整个运营流程,实时计算公司总收入,统计在读学员人数。 一.类的识别 1.学生类 2.班级类 3.课程类 4.公司类 5.收入明细类: 二.类的成员的定义(包括属性和方法) 1.学生类Student:姓名,经验值,勤奋程度(0.9),聪明程度(1.9),是否进入班级(true) 2.班级类Class:学员列表(List),开班日期, 3.课程类Course:课程名称,课时。 4.公司类Company:班级列表(List) ,课程列表(List),总收入,收入明细。学员列表,未进入班级的学员列表 5.收入明细类:收入金额,收入日志 三.类的成员方法的定义 1.学生类:学习,缴费 2.班级类:开班,关班,上课 3.课程类:课程名,课时 4.培训公司类:统计在校人数,统计全年收入,统计班级数.... 5.收入明细类: 四.启动一个定时器,模拟培训公司的运营情况 每一秒执行一个timer函数,模拟培训公司的运营状况(培训公司的一天): 1.招生(随机生成一个个学员对象,加入未开班班级,调用学员的缴费方法) 2.开班(需要判断是否满足条件[学员数量达到某个阈值]) 3.各班级上课。(判断关班[所有课程全部完毕])

course.py

class Course:
    def __init__(self,course_name,hour):
        self.hour = hour
        self.course_name = course_name
    def __str__(self):
        return self.course_name

course_table.py

from course import Course


class CourseTable:
    def __init__(self):
        self.tables = []
        self.tables.append(Course("python", 5))
        self.tables.append(Course("mysql", 3))
        self.tables.append(Course("flask", 5))
        self.tables.append(Course("django", 3))
        self.tables.append(Course("tensorflow", 5))
        self.tables.reverse()

student.py

# 学生类Student:姓名,经验值,勤奋程度(0.9),聪明程度(1.9),是否进入班级(true)
# 学生类:学习,缴费

class Student:
    def __init__(self):
        self.name = ''
        self.point = 0
        self.hard_degree = 0
        self.smart_degree = 0
        self.is_enter_class = False

    def pay_money(self):
        return 20000

    def study(self):
        if self.is_enter_class:
            self.point += 10 * self.hard_degree * self.smart_degree
            print(f'{self.name}的经验值已经增长到{self.point}')

xxx_class.py

from datetime import datetime

from course_table import CourseTable


# // 2.班级类Class:学员列表(List<Student>),开班日期,
# //2.班级类:开班,关班,上课

class xxxClass:
    class_num = 0

    def __init__(self):
        self.class_name = ''
        self.start_date = datetime.now()
        self.students = []
        self.course_table = CourseTable()

        # //从课程表里取出一个课程,该课程课时减1,判断课时是否为0,如果大于0,重新放回课程表,
        # //如果课程表为空,关闭班级

    def stand_up(self):
        is_closed = False
        c = self.course_table.tables.pop()
        print(f'{self.class_name}正在上{c.course_name}课,还有{c.hour}课时')
        hour = c.hour - 1
        if hour > 0:
            c.hour = hour
            self.course_table.tables.append(c)

        if len(self.course_table.tables) == 0:
            is_closed = True

        return is_closed

income_record.py

# //收入金额,收入日志
# //收到张三 10000
# //收到李四 10000
# //收到王五 10000

class IncomeRecord:
    def __init__(self):
        self.income = 0
        self.log = ''

company.py

# //4.培训公司类Company:班级列表(List<Class>)
# //,课程列表(List<Course>),总收入,收入明细(List<IncomeRecord>)。学员列表,未进入班级的学员列表
#     //培训公司类:统计在校人数,统计全年收入,统计班级数....
from random import randint

from income_record import IncomeRecord
from xxx_class import xxxClass
from student import Student


from time import time

class Company:
    def __init__(self):
        self.classes = []
        self.courses = []
        self.income = 0
        self.income_records = []
        self.inschool_students = []
        self.noclass_students = [] #交费了但还没有没有上课的学生列表(开班人数不够)
        self.num = 5 #达到多少人开班

    def add_money(self, student:Student):
        print(f'财务部收款{student.pay_money()}元')
        self.income += student.pay_money()
        ir = IncomeRecord()
        ir.income = student.pay_money()
        ir.log = f'收到{student.name} 学费 {student.pay_money()}元'
        self.income_records.append(ir)
        # 加入一个学生到未上课学员列表,考察当前列表长度,如果大于等于30人,开班
    def add_student_to_noclasslist(self, student:Student):
        self.noclass_students.append(student)
        size = len(self.noclass_students)
        print(f'当前招生人数{size}')
        if size >= self.num:
            # 新建一个班
            c = xxxClass()
            c.class_name = f'{xxxClass.class_num}班'
            xxxClass.class_num += 1
            self.classes.append(c)
            print(f'{c.start_date}:{c.class_name}开班了')

            # 转移学生,从lstNoClassStudents -->c
            for stud in self.noclass_students:
                stud.is_enter_class = True
                c.students.append(stud)

            self.noclass_students.clear()
    # //招生
    # //new 一个学生对象,返回。
    # //随机产生一个学员,先生成一个0-1之间的随机数
    # //如果该随机数小于0.7,就返回一个新学员对象
    # //否则,None
    # 招生成功率70 %
    def get_student(self):
        n = randint(1, 10)
        if n <= 7:
            # // 根据系统当前时间生成一个时间戳,保证用户名不重复
            # // 时间戳是当前时间距离19700101经过的毫秒数
            stu = Student()
            stu.name = f'张{time()}'
            stu.point = n * 10
            stu.hard_degree = randint(1, 10) #初始勤奋度是1-10,5属于正常水平
            stu.smart_degree = randint(1, 10) #初始聪明度是1-10,5属于正常水平
            stu.is_enter_class = False
            print(f'学员{stu.name}加入培训学习,等待新班')
            return stu;
        else:
            print(f'很遗憾,本次招生没有成功')
            return None

day_of_xxx.py

import time

from company import Company

import threading

# //        四.在main函数中启动一个定时器,模拟我们培训公司的运营情况
# //        每一秒执行一个timer函数模拟培训一天的运营状况(培训的一天)。
# //            1.招生(随机生成一个个学员对象,加入为开班班级,调用学员的缴费方法);
# //            2.开班(需要判断)
# //            3.各班级上课。(判断关班)
index = 0
def day_of_xxx(company:Company):
    global index
    index += 1
    if index % 7 == 0:
        student_num = len(company.income_records)
        total_income = sum(map(lambda x:x.income,company.income_records))

        print('-' * 30 + f'周末休息' + '-' * 30)
        print(f'\033[1;35m截止目前共有{student_num}名学员来到培训学习,公司总营收收入{total_income}元\033[0m')
        print('-' * 30 + f'周末休息' + '-' * 30)
        time.sleep(3)

    print('-' * 30 + f'xx培训美好的一天开始了,各部门员工紧张忙碌了起来' + '-' * 30)

    print('市场部开始接待客户')
    student = company.get_student()
    if student:
        company.add_money(student)
        company.add_student_to_noclasslist(student)


    print(f"当前有{len(company.classes)}个班级在上课")
    # 存储需要关闭的班级
    class_removed = []

    if len(company.classes) > 0:
        print('实施部的大咖们开始给学员上课了')

    for c in company.classes:
        is_closed = c.stand_up()
        for stud in c.students:
            stud.study()
        if is_closed:
            class_removed.append(c)

    for c_del in class_removed:
        print(f'{c_del.class_name}学生结业了,全部找到高薪工作,走上人生巅峰,迎娶白富美')
        company.classes.remove(c_del)

    global timer
    timer = threading.Timer(1, day_of_xxx, [company])
    timer.start()



company = Company()
timer = threading.Timer(1, day_of_xxx, [company])  #首次启动
#启用定时器
timer.start()

补充---python中的定时器

#引入库 threading
import threading
#定义函数
def fun_timer(msg,count):
    print('hello timer'+msg+str(count))   #打印输出
    global timer  #定义变量
    timer = threading.Timer(1,fun_timer,[msg,count])   
    timer.start()    #启用定时器


#定时器构造函数主要有2个参数,第一个参数为时间处理函数,第二个参数为时间处理函数函数名
#第三个参数为传递给fun_timer的参数列表
#1秒后调用函数fun_timer
timer = threading.Timer(1,fun_timer,['hello',5])  #首次启动
timer.start()

本文作者:豆约翰

版权声明:本站所有文章,未经允许,禁止转载

手把手教你从零开始使用python编写大型冒险类游戏01之游戏介绍
0 条评论

请先登陆注册

已登录,注销 取消