组合
(1)组合的概念
- 在一个类中以另外一个类的对象作为数据属性,称为类的组合。
(2)组合的使用
- 组合与继承都是用来解决代码的重用性问题。
- 不同的是:
- 继承是一种“是”的关系,比如老师是人、学生是人,当类之间有很多相同的之处,应该使用继承;
- 而组合则是一种“有”的关系,比如老师有生日,老师有多门课程,当类之间有显著不同,并且较小的类是较大的类所需要的组件时,应该使用组合
| class Course: |
| def __init__(self, name, period, price): |
| self.name = name |
| self.period = period |
| self.price = price |
| |
| def tell_info(self): |
| print(f'当前课程名字 {self.name} 当前课程周期 {self.period} 当前课程价格 {self.price}') |
| |
| |
| class Date: |
| def __init__(self, year, mon, day): |
| self.year = year |
| self.mon = mon |
| self.day = day |
| |
| def tell_birth(self): |
| print(f'当前生日 {self.year} 年 {self.mon} 月 {self.day} 日') |
| |
| |
| class People: |
| school = '清华大学' |
| |
| def __init__(self, name, sex, age): |
| self.name = name |
| self.sex = sex |
| self.age = age |
| |
| |
| |
| |
| class Teacher(People): |
| |
| def __init__(self, name, sex, age, title, year, mon, day): |
| super().__init__(name, sex, age) |
| |
| self.birth = Date(year, mon, day) |
| |
| self.courses = [] |
| |
| def teach(self): |
| print(f'当前老师正在授课 {self.name}') |
| |
| |
| date = Date(year=2001, mon=4, day=25) |
| date.tell_birth() |
| teacher = Teacher(name='heart', sex='male', age=18, title='金牌讲师', year=2001, mon=4, day=25) |
| teacher.teach() |
| |
| teacher.birth.tell_birth() |
| |
| python = Course('python', '3mons', 3000.0) |
| linux = Course('linux', '5mons', 5000.0) |
| |
| teacher.courses.append(python) |
| teacher.courses.append(linux) |
| |
| for obj in teacher.courses: |
| obj.tell_info() |
| |
| |
- 此时对象teacher集对象独有的属性、Teacher类中的内容、Course类中的内容于一身(都可以访问到),是一个高度整合的产物
(3)组合和继承的区别
- 组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,
(1)继承的方式
- 通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。
- 当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人
(2)组合的方式
- 用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通