组合

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

 

posted @ 2021-12-07 20:14  tslam  阅读(78)  评论(0编辑  收藏  举报