需求

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

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

类图

实现代码

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

#!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. YsoSerial 工具常用Payload分析之Common-Collections7(四)

    前言 YsoSerial Common-Collection3.2.1 反序列化利用链终于来到最后一个,回顾一下: 以InvokerTranformer为基础通过动态代理触发AnnotationInv ...

  2. 后台程序编译过程报错PCC-F-02104, Unable to connect to Oracle

    偶然重新编译了一下后台程序,发现编译过程报错无法连接数据库.但通过sqlplus登录数据库是正常的.后台程序改动中也做了详细的分析,没有改动相关数据库的参数和配置. 最后通过浏览器查看了很多相关问题的 ...

  3. 通过cmake在Android中调用c语言,且三方应用通过so库调用c语言

    1.  新建JniUtils类实现native方法 2.  在build中执行clean project 再rebuild project 生成class文件. 注意:最新版本的AndroidStud ...

  4. RHCSA_DAY05

    计算机硬件组成部分 输入设备:键盘.鼠标.触控屏等 主机设备:主板.中央处理器(CPU).主存储器(内存).网卡.声卡.显示卡等 输出设备:屏幕.耳机.打印机.投影仪等 外部存储设备:硬盘.软盘.光盘 ...

  5. 进程信号的未决状态(pending status)

    这两天看了apue有关进程信号的部分,觉得未决状态这个词很是不一般,呵呵.一开始当我看到这个词,我不理解,什么意思呢,读了好几遍.不知道是书里面讲的晦涩难懂,还是脑子越来越不行了,就是没有搞明白.后来 ...

  6. 从官网下载历史版本的java

    下载历史版本的java 因为一些bug需要降低java版本来尝试解决,但是好多都要收费,我就搞不明白了,官网都有免费的我要你的收费软件干嘛 首先直接搜索java,进入Oracle,或者 Java SE ...

  7. ansible 常用模块总结

    记录常用的模块功能,详细使用查看官网. 1. file模块 创建软连接 ansible test -m file -a "src=/tmp/conf.d dest=/tmp/conf.d s ...

  8. HttpClient4.3教程 第三章 Http状态管理

    最初,Http被设计成一个无状态的,面向请求/响应的协议,所以它不能在逻辑相关的http请求/响应中保持状态会话.由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统,比如电子商务 ...

  9. 在localStorage中存储对象数组并读取

    频繁ajax请求导致页面响应变慢. 于是考虑将数据存储在window.storage中,这样只请求一次ajax,而不需要频繁请求. 鉴于localstorage中只能存储字符串,所以我们要借助于JSO ...

  10. 【IDE】WebStorm常用快捷键

    WebStorm常用快捷键 1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件. 2. ctrl + j: 输出模板 3. ctrl + b: 跳到变量申明 ...