组合
1. 什么是组合
组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象
2. 为何要用组合
通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起
从而减少类与类之间代码冗余
3. 如何用组合
组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,
1.继承的方式
通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人
2.组合的方式
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...
class OldboyPeople: school = 'Oldboy' def __init__(self,name,age,sex,): self.name = name self.age = age self.sex = sex class OldboyStudent(OldboyPeople): def __init__(self, name, age, sex,score=0): OldboyPeople.__init__(self,name,age,sex) self.score = score self.courses=[] def choose_course(self): print('%s choosing course' % self.name) def tell_all_course(self): print(('学生[%s]选修的课程如下' %self.name).center(50,'=')) for obj in self.courses: obj.tell_info() print('='*60) class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,level): OldboyPeople.__init__(self,name,age,sex) self.level=level self.courses=[] def score(self,stu,num): stu.score=num def tell_all_course(self): print(('老师[%s]教授的课程如下' %self.name).center(50,'*')) for obj in self.courses: obj.tell_info() print('*'*70) class Course: def __init__(self,c_name,c_price,c_period): self.c_name = c_name self.c_price = c_price self.c_period = c_period def tell_info(self): print('<课程名:%s 价钱:%s 周期:%s>' %(self.c_name,self.c_price,self.c_period)) # 创建课程对象 python=Course('python全栈开发',1900,'5mons') linux=Course('linux架构师',900,'3mons') stu1=OldboyStudent('刘二蛋',38,'male') stu1.courses.append(python) stu1.courses.append(linux) # print(stu1.courses) stu1.tell_all_course() tea1=OldboyTeacher('egon',18,'male',10) tea1.courses.append(python) # print(tea1.courses) tea1.tell_all_course()