面向对象之组合
面向对象之组合
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()