组合
1 定义:
让类实例化的对象具备一个数据属性,该属性的值是另外一个对象
eg: 小明(class Student产生的对象)选择了课程(属性)python(class Course产生的对象)
学生的课程属性直接就是一个课程对象
思考:既然是组合,是什么跟什么组合到一起了?
2 为什么用组合
解决代码重复性问题
3 什么场景下用组合
继承与组合的区分:
继承是一种"是"的关系,比如老师是人,学生是人,当类之间有很多相同之处,应该用继承;
组合是一种"有"的关系,比如老师有课程,学生有课程,而老师类与学生类的课程是不同的,
并且,较小的类(课程)是较大的类(学生/老师)所需的组件,应该用组合
# # 例1 # class Foo(): # def __init__(self, m): # self.m = m # # class Bar(): # def __init__(self, n): # self.n = n # # f1 = Foo(10) # b1 = Bar(20) # # # f1.m= b1 # 这即是组合 # print(f1.m.n) # 20 # # 例2 # class People(): # def __init__(self, name, age): # self.name = name # self.age = age # # # class Course(): # def __init__(self, name, period, price): # self.name = name # self.period = period # self.price = price # # class Birth(): # def __init__(self, year, month, day): # self.year = year # self.month = month # self.day = day # # class Student(People): # 学生是人 # def __init__(self, name, age, year, month, day): # super().__init__(name, age) # self.birth = Birth(year, month, day) # 学生有生日(基于组合用Birth) # self.courses = [] # 学生有课程,可以实例化后,往该列表添加Course的对象 # # stu1 = Student('lixiang', 20, 1990, 2, 13) # # 理解1 # print(stu1.birth.__dict__) # print(stu1.birth.year) # print(stu1.birth.month) # # 理解2 # python = Course('python', '6m', '2.1w') # java = Course('java', '18m', '2w') # # # stu1 有两门课程 # stu1.courses.append(python) # 将python对象当作参数传进去 # stu1.courses.append(java) # 将java对象当作参数传进去 # res = stu1.courses[1] # print(res.name) # java