面向对象之组合

面向对象之组合 1、什么是组合 组合是指一个对象中,包含另一个或多个对象 2、为什么要用组合 减少代码冗余 3、耦合度 耦合度越高,程序的可扩展性越差 耦合度

面向对象之组合

1、什么是组合

组合是指一个对象中,包含另一个或多个对象

2、为什么要用组合

减少代码冗余

3、耦合度

耦合度越高,程序的可扩展性越差

耦合度越低,程序的可扩展性越高

4、组合的的使用

继承:继承是类与类之间的关系,子类继承父类的属性与方法,子类与父类是从属关系

组合:组合是对象与对象之间的关系,一个对象拥有另一个或多个对象的属性或方法

# 父类
class People:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

# 学生类
class Student(People):
    def __init__(self,name, age, sex):
        super().__init__(name, age, sex)

    def learn(self):
        print('learning...')

# 老师类
class Teacher(People):
    def __init__(self,name, age, sex):
        super().__init__(name, age, sex)

    def teach(self):
        print('teach...')

# 时间类
class Date:
    def __init__(self,year,month,day):
        self.year = year
        self.month = month
        self.day = day
    def print_date(self):
        print(f'''
            生日为{self.year}年{self.month}月{self.day}日
        ''')

stu_obj = Student('shen',18,'male')
date_obj = Date('2001','8','8')
# 将学生对象中加入日期对象
stu_obj.date_obj = date_obj
# 通过学生对象调用日期对象
stu_obj.date_obj.print_date()

teac_obj = Teacher('王',25,'female')
date_obj = Date('1996','8','8')
# 将老师对象中加入日期对象
teac_obj.date_obj = date_obj
# 通过学生对象调用日期对象
teac_obj.date_obj.print_date()
'''
练习需求:
    选课系统:
        1.有学生、老师类,学生与老师有属性 “名字、年龄、性别、课程”,
        2.有方法 老师与学生可以添加课程, 打印学习/教授课程。

    # 组合实现
'''

class People:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
    #打印生日
    def print_date(self):
        print(f'''
            生日{self.date_obj.year}年{self.date_obj.month}月{self.date_obj.day}日
        ''')
    # 添加课程到课程列表中
    def add_course(self, course_obj):
        self.course_list.append(course_obj)
    # 打印所有课程信息
    def print_all_course(self):
        for course_obj in self.course_list:
            course_obj.print_course_info()

class Student(People):
    def __init__(self,name, age, sex):
        super().__init__(name, age, sex)
        self.course_list = []

class Teacher(People):
    def __init__(self, name, age, sex):
        super().__init__(name, age, sex)
        self.course_list = []

class Date:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

class Course:
    def __init__(self, name, price, period):
        self.name = name
        self.price = price
        self.period = period
    # 打印一条课程信息
    def print_course_info(self):
        print(f'''
                课程名:{self.name} 课程价格:{self.price} 课程周期:{self.period}
           ''')

stu_obj = Student('shen', '18', 'male')
date_obj = Date(2001, 8, 8)
# 通过学生对象打印出生日
stu_obj.date_obj = date_obj
stu_obj.print_date()

course_obj1 = Course('python', '2000', '2')
course_obj2 = Course('php', '1800', '2')

teac_obj = Teacher('wang', 24, 'female')
# 为老师添加课程
teac_obj.add_course(course_obj2)
teac_obj.add_course(course_obj1)
# 打印所有课程信息
teac_obj.print_all_course()