一. 什么是组合
组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象
例如:
class Foo:
x=1
class Bar:
y=2
obj = Foo()
obj.attr=Bar()
print(obj.x) #1
print(obj.attr.y) #2
二.为何要用组合
通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起
从而减少类与类之间代码冗余
三.怎么用组合
代码如下,为学生类的对象stu1添加属性(属性的值是课程Course类的对象python)
#父类
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):
OldboyPeople.__init__(self,name,age,sex)
self.score=score
self.course=[]
def choose_course(self):
print('%s正在选课'%self.name)
def tell_all_course(self):
print('学生[%s]的课程信息如下'%self.name)
for obj in self.course:
obj.tell_course()
print('='*50)
#定义老师类
class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,level):
OldboyPeople.__init__(self,name,age,sex)
self.level=level
self.course=[]
def score(self,obj,num):
obj.score=num
def tell_all_course(self):
print('老师[%s]的课程信息如下'%self.name)
for obj in self.course:
obj.tell_course()
print('='*50)
#定义课程类
class Course:
def __init__(self,c_name,c_price,c_zq):
self.c_name=c_name
self.c_price=c_price
self.c_zq=c_zq
def tell_course(self):
print('<课程名:%s 价格:%s 周期:%s>'%(self.c_name,self.c_price,self.c_zq))
#创建对象
python=Course('python','100','10day')
linux=Course('linux','80','15day')
stu1=OldboyStudent('wzj','18','male','100')
tea1=OldboyTeacher('egon','73','male','10')
#添加课程
stu1.course.append(python)
stu1.course.append(linux)
tea1.course.append(python)
#查看课程
stu1.tell_all_course()
tea1.tell_all_course()