什么是组合:组合指的是一个对象中,包含另一个或多个对象

为什么用组合:减少代码的冗余

继承与组合的区别:

​ 继承是类与类的关系,子类继承父类的属性与方法,子类与父类是一种从属关系

​ 组合是对象与对象的关系,一个对象拥有另一个对象中的属性与方法,是一种什么有什么的关系

#组合实现
class People:
	def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

        
#老师类
class Teacher(People):
    def __init__(self, name, age, gender):
        super().__init__(name, age, gender)
        
#学生类
class Student(People):
    def __init__(self, name, age, gender):
        super().__init__(name, age, gender)
        
#日期类
class Date:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
        
	def tell_birth(self):
        print(f'''
        ===== 出生年月日 =====
        年:{self.year}
        月:{self.month}
        日:{self.day}
        
        ''')

stu1 = Student('lll', 18, 'male')
date_obj = Date(2000, 1, 1)
#学生对象中包含日期对象
stu1.date_obj = date_obj
print(stu1.date_obj.year, stu1.date_obj.month, stu1.date_obj.day)
#2000 1 1
stu1.date_obj.tell_birth()
'''
         ==== 出生日期 ====
           年:2000
           月:1
           日:1
'''
'''
练习需求:
    选课系统:
        1.有学生、老师类,学生与老师有属性 “名字、年龄、性别、课程”,
        2.有方法 老师与学生可以添加课程, 打印学习/教授课程。

'''


class People:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    # 添加课程
    def add_course(self, course_obj):
        self.course_list.append(course_obj)

    # 打印当前对象中课程列表里所有课程信息
    def tell_all_course_info(self):
        #从当前对象课程列表中打印出所有课程信息
        for course_obj in self.course_list:
            course_obj.tell_course_info()


# 学生类
class Student(People):
    def __init__(self, name, age, gender):
        super().__init__(name, age, gender)
        # 添加课程列表属性
        self.course_list = []


# 老师类
class Teacher(People):
    def __init__(self, name, age, gender):
        super().__init__(name, age, gender)
        # 添加列表属性
        self.course_list = []


# 定义一个课程类,包含课程名称,课程价格,课程周期
class Course:

    def __init__(self, course_name, course_price, course_period):
        self.course_name = course_name
        self.course_price = course_price
        self.course_period = course_period


    # 定义打印课程信息的方法
    def tell_course_info(self):
        print(f'''
            ====== 课程信息如下 ======
            课程名称:{self.course_name}
            课程价格:{self.course_price}
            课程周期:{self.course_period}
        ''')


# 创建学生对象
stu1 = Student('lll', 18, 'male')
# 创建课程对象
python_obj = Course('python', 20000, 6)
go_obj = Course('go', 30000, 5)
# 学生调用添加课程功能
stu1.add_course(python_obj)
stu1.add_course(go_obj)
# 学生调用打印功能,打印学生课程列表中所有课程信息
stu1.tell_all_course_info()