需求

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

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

类图

实现代码

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

#!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. Gitea 1.4.0 目录穿越导致命令执行漏洞

    复现 POST /vulhub/repo.git/info/lfs/objects HTTP/1.1 Host: 192.168.49.2:3000 Accept-Encoding: gzip, de ...

  2. cmd MySQL登录

    mysql -uroot -p >Mysql -P 3306 -h 0.0.0.0 -u root -p 可远程访问

  3. 为MySQL的source命令导入SQL文件配置参数

    为MySQL的source命令导入SQL文件配置参数 执行 mysql -uroot -p 输入密码后进入 MySQL 命令提示符 set charset utf8; source /root/xxx ...

  4. netty系列之:netty中的Channel详解

    目录 简介 Channel详解 异步IO和ChannelFuture Channel的层级结构 释放资源 事件处理 总结 简介 Channel是连接ByteBuf和Event的桥梁,netty中的Ch ...

  5. Python学习的十个阶段,学完神功大成,对应一下看看你自己在哪个阶段

    大家好,我是白云. 今天给大家整理了Python学习的十个阶段内容,看看你现在正处于哪个阶段,想学习的朋友也可以根据这个阶段规划学习. 阶段一:Python基础[ 初入江湖] Linux基础 目标: ...

  6. 八数码难题之 A* 算法

    人生第一个A*算法-好激动-- 八数码难题--又称八数码水题,首先要理解一些东西: 1.状态可以转化成整数,比如状态: 1 2 3 4 5 6 7 8 0 可以转化成:123456780这个整数 2. ...

  7. 使用Freemarker导出Word文档(包含图片)代码实现及总结

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  8. Deepin Pwn环境的配置

    要学习Pwn  Pwn环境那是必不可少滴! 我是新手,我也弄了好久,这里把经验分享给大家!这里感谢I春秋的"知世"老师的脚本!虽然写的不是很完美.还得我自己动手修改!PS:http ...

  9. linux 源码搭建Kafka集群,100%有效

    kafka源码编译安装 准备三台服务器 192.168.xxx.xxx 192.168.xxx.xxx 192.168.xxx.xxx 安装kafka前需先安装JDK和zookeeper如下步骤: J ...

  10. WPF MVVM模式下路由事件

    一,路由事件下三种路由策略: 1 冒泡:由事件源向上传递一直到根元素.2直接:只有事件源才有机会响应事件.3隧道:从元素树的根部调用事件处理程序并依次向下深入直到事件源.一般情况下,WPF提供的输入事 ...