需求

设计一个培训机构管理系统,有总部、分校,有学员、老师、员工,实现具体如下需求:

  • 有多个课程,课程要有定价
  • 有多个班级,班级跟课程有关联
  • 有多个学生,学生报名班级,交这个班级对应的课程的费用
  • 有多个老师,可以分布在不同校区,上不同班级的课
  • 有多个员工,可以分布在不同校区,在总部可以统计各校区的账户余额、员工人数、学员人数
  • 学生可以退学

类图

实现代码

这肯定不是最优代码, 如果有大佬给出更优解一定要给我评论哦

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog: https://www.cnblogs.com/poloyy/
# time: 2021/9/7 11:18 下午
# file: 18_实战6.py
""" # 课程类
class Course(object):
def __init__(self, name, price):
# 课程名、课程价格:私有属性
self.__name = name
self.__price = price @property
def name(self):
return self.__name @name.setter
def name(self, name):
self.__name = name @property
def price(self):
return self.__price @price.setter
def price(self, price):
self.__price = price # 人类
class Person(object):
def __init__(self, name, sex, phone):
self.name = name
self.sex = sex
self.phone = phone def __str__(self):
return f"姓名:{self.name}, 性别{self.sex}, 电话:{self.phone}" # 学生类
class Student(Person):
def __init__(self, name, sex, phone, balance):
super(Student, self).__init__(name, sex, phone)
# 学生余额、报名的班级:私有属性
self.__balance = balance
self.__class_list = [] @property
def classList(self):
return [class_.name for class_ in self.__class_list] # 报名班级
def addClass(self, class_):
price = class_.price
# 1、如果学生余额大于班级费用
if self.__balance > price:
# 2、报名成功
self.__class_list.append(class_)
# 3、减去报名费
self.__balance -= price
# 4、班级的学生列表也需要添加当前学生
class_.addStudent(self)
# 5、班级总额增加
class_.totalBalance()
return
print("余额不足,无法报名班级") # 退学
def removeClass(self, class_):
if class_ in self.__class_list:
# 1、报名班级列表移除
self.__class_list.remove(class_)
# 2、班级学生列表移除当前学生
class_.removeStudent(self)
print("班级不存在,无法退学") # 员工类
class Employ(Person):
def __init__(self, name, sex, phone):
super(Employ, self).__init__(name, sex, phone)
# 工资:私有属性
self.money = 0 # 老师类
class Teacher(Employ):
def __init__(self, name, sex, phone):
super(Teacher, self).__init__(name, sex, phone)
# 授课班级:私有属性
self.__class_list = [] @property
def classList(self):
return [class_.name for class_ in self.__class_list] # 授课
def teachClass(self, class_):
# 1、授课列表添加班级
self.__class_list.append(class_)
# 2、班级添加授课老师
class_.teacher = self # 班级类
class Class(object):
def __init__(self, name):
# 班级名、班级费用、课程列表、学生类表、班级老师、所属学校:私有属性
self.__name = name
self.__price = 0
self.__course_list = []
self.__student_list = []
self.__teacher = None
self.__balance = 0
self.__school = None @property
def name(self):
return self.__name @name.setter
def name(self, name):
self.__name = name @property
def school(self):
return self.__school.name @school.setter
def school(self, school):
self.__school = school @property
def price(self):
return self.__price @property
def courseList(self):
return self.__course_list def addCourse(self, course):
# 1、班级费用累加课程费用
self.__price += course.price
# 2、添加到课程列表
self.__course_list.append(course) @property
def studentList(self):
return [stu.name for stu in self.__student_list] def addStudent(self, student):
self.__student_list.append(student) def removeStudent(self, student):
self.__student_list.remove(student) @property
def teacher(self):
return self.__teacher @teacher.setter
def teacher(self, teacher):
self.__teacher = teacher @property
def balance(self):
return self.__balance # 统计班级一个班级收入
def totalBalance(self):
self.__balance = len(self.__student_list) * self.__price # 学校类
class School(object):
def __init__(self, name, balance):
# 学校名、学校余额、学校员工列表:公共属性
self.name = name
self.balance = balance
self.employ_list = []
# 分校列表:私有属性
self.__school_list = [] def __str__(self):
return f"学校:{self.name} 余额:{self.balance}" # 获取学校分校列表
@property
def schoolList(self):
return [school.name for school in self.__school_list] # 添加分校
def addBranchSchool(self, school):
self.__school_list.append(school) # 添加员工
def addEmploy(self, employ):
self.employ_list.append(employ) # 查看员工列表
def getEmploy(self):
return [emp.name for emp in self.employ_list] # 统计各分校的账户余额
def getTotalBalance(self):
res = {}
sum = 0
for school in self.__school_list:
# 1、结算一次分校余额
school.getTotalBalance()
res[school.name] = school.balance
# 2、累加分校余额
sum += school.balance
res[self.name] = sum
return res # 统计员工人数
def getTotalEmploy(self):
sum_emp = 0
for school in self.__school_list:
sum_emp += len(school.employ_list)
sum_emp += len(self.employ_list)
return sum_emp # 统计学生总人数
def getTotalStudent(self):
sum_stu = 0
for school in self.__school_list:
sum_stu += school.getTotalStudent()
return sum_stu # 分校类
class BranchSchool(School):
def __init__(self, name, balance):
super(BranchSchool, self).__init__(name, balance)
# 分校的班级列表:私有属性
self.__class_list = [] # 获取班级列表
@property
def classList(self):
return [class_.name for class_ in self.__class_list] # 添加班级
def addClass(self, class_):
# 1、添加班级
self.__class_list.append(class_)
# 2、添加老师员工
self.addEmploy(class_.teacher) # 获取总的余额
def getTotalBalance(self):
for class_ in self.__class_list:
# 1、结算班级收入
class_.totalBalance()
# 2、累加班级收入
self.balance += class_.balance # 获取学生总人数
def getTotalStudent(self):
sum_stu = 0
for class_ in self.__class_list:
sum_stu += len(class_.studentList)
return sum_stu # 总校
school = School("小菠萝总校", 100000)
# 分校
bj1 = BranchSchool("小猿圈北京分校", 2222)
sz1 = BranchSchool("深圳南山大学城分校", 5555) # 添加分校
school.addBranchSchool(bj1)
school.addBranchSchool(sz1) # 初始化班级
class1 = Class("Python 基础班级")
class2 = Class("Python 进阶班级") # 初始化课程
c1 = Course("Python 基础", 666)
c2 = Course("Python 进阶", 1666)
c3 = Course("Python 实战", 2666) # 添加课程
class1.addCourse(c1)
class1.addCourse(c2)
class2.addCourse(c2)
class2.addCourse(c3) # 初始化老师
tea1 = Teacher("小菠萝老师", "girl", 1355001232)
tea2 = Teacher("大菠萝老师", "boy", 1355001232) # 老师授课
tea1.teachClass(class1)
tea2.teachClass(class2) bj1.addClass(class1)
sz1.addClass(class2) # 初始化学生
stu1 = Student("小菠萝", "girl", 1355001232, 50000)
stu2 = Student("大菠萝", "boy", 1355001231, 50000)
stu3 = Student("大大菠萝", "girl", 1355001233, 10000)
# 学生报名
stu1.addClass(class1)
stu1.addClass(class2)
stu2.addClass(class1)
stu3.addClass(class2) # 普通员工
emp1 = Employ("小菠萝员工", "girl", 1355001232)
emp2 = Employ("大菠萝员工", "boy", 1355001231)
emp3 = Employ("小小菠萝员工", "girl", 1355001233) print(bj1.getTotalStudent())
print(school.getTotalBalance())
print(school.getTotalEmploy())

Python - 面向对象编程 - 实战(6)的更多相关文章

  1. Python - 面向对象编程 - 实战(4)

    需求:士兵突进 士兵许三多有一把 AK47 士兵可以开火 枪能够发射子弹 枪装填子弹,可以增加子弹数量 需求分析 很明显有两个类:士兵类,枪类 AK47 是枪名,是枪类的属性,每把枪都有子弹数,所以子 ...

  2. Python - 面向对象编程 - 实战(5)

    前言 主要是针对静态方法.类方法.实例方法.类属性.实例属性的混合实战 需求 设计一个 Game 类 属性 定义一个类属性 top_score 记录游戏的历史最高分,这个属性很明显只跟游戏有关,跟实例 ...

  3. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  4. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  5. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  6. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  7. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  8. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  9. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

随机推荐

  1. SQL Server 判断表名称、索引、表字段是否存在

    1.判断索引是否存在 ps:@tableName 表名称, @indexName 索引名 IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id=OB ...

  2. 遥远的国度 (树链剖分换根),洛谷P3979

    析:显然,若没有换根操作,则为树链剖分板子题,但是这道题我们考虑换根操作 考虑这样一个性质:在一棵树上,两点的距离路径是唯一的!! 也就是说,我们在修改路径上的点权时,不必考虑根在哪里,直接利用模板修 ...

  3. K8S为什么要弃用Docker?Dockershim将移除

    一.背景由于最近知道了 K8s 新版本(v1.20)确定弃用 Docker 的消息,为了明确是否会对现有系统架构产生响,所以对涉及到的相关技术进行了一定的梳理(索性的是对现有的系统架构基本无影响:&g ...

  4. Appium自动化测试(1)-安装&环境

    需要链接appium自动化测试教程 http://www.cnblogs.com/fnng/p/4540731.htmlappium中文文档:https://github.com/appium/app ...

  5. Nginx 配置错误导致漏洞

    目录 1.CRLF注入漏洞 2.目录穿越漏洞 参考链接 1.CRLF注入漏洞 CRLF是"回车+换行"(\r\n)的简称,其十六进制编码分别为0x0d和0x0a.先看payload ...

  6. 解决java种mysql中文乱码问题

    乱码问题原因有多种,其中有一种是由于MySQL默认使用 ISO-8859-1 ( 即Latin1 ) 字符集,而JAVA内部使用Unicode编码,因此在JAVA中向MYSQL数据库插入数据时,或者读 ...

  7. 北航OO第四单元——UML图解析

    北航OO第四单元--UML图解析 作业要求简析 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下: UML图的保存格式.mdj文件是以json文件的形式存储的,将每一个Um ...

  8. Python - typing 模块 —— Any Type

    前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...

  9. 【译】flutter中如何较好地实现隐藏和显示widget

    通常情况下,显示有四种情况: 1.(visible)显示 2.(invisible)隐藏: 这种隐藏是指在屏幕中占据空间,只是没有显示.这种情况出现场景如:用带有背景色的Container Widge ...

  10. C++类的构造函数后面加一个冒号的含义

    最近在看侯捷老师讲解的C++知识,他讲到在构造函数加一个冒号初始化值的方法,会使代码更大气,在此记录一下使用方法 构造函数冒号后的初始化class complex{public: complex(do ...