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