需求

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

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

类图

实现代码

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

#!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. ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)

    影响版本 在FFMpeg2.X poc http://192.168.49.2:8000/?name={%25%20for%20c%20in%20[].__class__.__base__.__sub ...

  2. Typhoon靶机

    仅供个人娱乐 靶机信息 靶机下载地址:https://www.vulnhub.com/entry/typhoon-102,267/ 一.主机探测 arp-scan -l nmap -sV -p- -A ...

  3. 大数据学习(17)—— HBase表设计

    为啥要把表设计拿出来独立成章?因为我觉得像我这样搞了很多年Java后端开发的技术人员,在学习HBase的时候,会受到关系型数据库3NF.BCNF的影响.事实上,数据库范式在HBase里完全没用,必须转 ...

  4. netty系列之:Event、Handler和Pipeline

    目录 简介 ChannelPipeline ChannelHandler ChannelHandlerContext ChannelHandler中的状态变量 异步Handler 总结 简介 上一节我 ...

  5. CentOS7 快速安装配置mysql8.0

    因为这个项目是两台CentOS7虚拟机,一台当作 MySQL服务器,所以需要配置3306端口公开 参考教学视频:Java2020体系课 22周课 5-2~3 两节课 yum search mysql- ...

  6. Java:导出Excel大批量数据的优化过程

    背景 团队目前在做一个用户数据看板(下面简称看板),基本覆盖用户的所有行为数据,并生成分析报表,用户行为由多个数据来源组成(餐饮.生活日用.充值消费.交通出行.通讯物流.交通出行.医疗保健.住房物业. ...

  7. MySQL记录之间是单向链表还是双向链表?

    前言 本文的观点是基于MySQL使用Innodb存储引擎的情况下进行的! 很多渠道说:MySQL数据按照主键大小依次排列,记录之间是双向链表连起来.如果说我告诉你这种说法很大程度上是错的,你肯定说我在 ...

  8. 说说XXE漏洞那些事

    想不起来写点啥了,又是摸鱼的一天,看了一些红队大佬们整理的资料,非常精彩,于是一个咸鱼翻身先选了一些简单的小点来写一写个人的感想(后续会继续更新其他内容) 不能说写的是技术分享,因为师傅们的文章珠玉在 ...

  9. noip模拟44[我想我以后会碰见计数题就溜走的]

    noip模拟44 solutions 这一场抱零的也忒多了,我也只有45pts 据说好像是把几套题里面最难的收拾出来让我们考得 好惨烈啊,这次的考试我只有第一题骗了40pts,其他都抱零了 T1 Em ...

  10. python3.9 manage.py runserver 报错问题解决

    报错信息如下 You have 13 unapplied migration(s). Your project may not work properly until you apply the mi ...