类的组合初识
什么是类的组合
将毫无关系的多个类在一个类中执行实例化,让彼此之间产生关联.就是类的组合
为什么要有类的组合
通过类的组合,可以使程序的逻辑更为明确,从而增强了程序的可扩展性。
类的组合使用注意事项
类的组合在设计时对于初学者来说会十分的繁琐。因此一定要注意理好程序的逻辑,否则那将是一件非常糟糕的事情…
Ps:面向对象的思想设计程序其实就是在面向过程之上加了一层封装分类,将一些功能或属性封装到一个其他的类里面。这样的做法势必会增加其设计难度,但是一旦程序设计完成之后使用和维护将会变得非常简单。
案例分析
类的组合案例初始版
待优化:不能通过学校直接拿到班级再拿到课程信息…
class School(object): """学校类""" def __init__(self,name): self.name = name self.class_obj_list = [] def add_classes(self,class_obj): """新增班级""" self.class_obj_list.append(class_obj) def show_classes(self): """查看班级信息""" print("[{0}]的班级信息如下".format(self.name)) for classes in self.class_obj_list: classes.show_classes_msg() #直接调用对象的方法class Classes(object): """班级类""" def __init__(self,name,create_time): self.name = name self.create_time = create_time self.course_obj_list = [] def add_course(self,course_obj): """新增课程""" self.course_obj_list.append(course_obj) def show_classes_msg(self): """查看班级信息""" print("班级的名字是:[{0}].班级的创建时间是[{1}]".format(self.name, self.create_time)) def show_course(self): """查看课程信息""" print("[{0}]的课程信息如下:".format(self.name)) for course in self.course_obj_list: course.show_course_msg() # 直接调用对象的方法class Course(object): """课程类""" def __init__(self,name,price): self.name = name self.price = price def show_course_msg(self): """查看课程信息""" print("课程的名字是:[{0}].课程的价格是[{1}]".format(self.name,self.price))# ==== 添加学校 ===s1 = School("黄埔军校")# ==== 为学校添加班级 ====classes_1 = Classes("陆军1班","1927-01-28")classes_2 = Classes("海军2班","1927-02-14")s1.add_classes(classes_1)s1.add_classes(classes_2)# ==== 为班级添加课程 ===course_1 = Course("坦克驾驶技术",19999)course_2 = Course("轰炸机驾驶技术",12888)classes_1.add_course(course_1)classes_2.add_course(course_2)# ==== 查看学校的班级信息 ====s1.show_classes()# ==== 查看班级的课程信息 ====classes_1.show_course()classes_2.show_course()# ===- 执行结果 ===="""[黄埔军校]的班级信息如下班级的名字是:[陆军1班].班级的创建时间是[1927-01-28]班级的名字是:[海军2班].班级的创建时间是[1927-02-14][陆军1班]的课程信息如下:课程的名字是:[坦克驾驶技术].课程的价格是[19999][海军2班]的课程信息如下:课程的名字是:[轰炸机驾驶技术].课程的价格是[12888]"""
类的组合案例优化版
优化版:可通过学校拿到班级再拿到课程信息…
class Classes(object): """班级类""" def __init__(self,name,create_time): self.name = name self.create_time = create_time self.course_obj_list = [] def show_classes_msg(self): """查看班级信息""" print("班级的名字是:[{0}].班级的创建时间是[{1}]".format(self.name, self.create_time)) def show_course(self): """查看课程信息""" print("[{0}]的课程信息如下:".format(self.name)) for course in self.course_obj_list: course.show_course_msg() # 直接调用对象的方法class Course(object): """课程类""" def __init__(self,name,price): self.name = name self.price = price def show_course_msg(self): """查看课程信息""" print("课程的名字是:[{0}].课程的价格是[{1}]".format(self.name,self.price))class School(object): """学校类""" def __init__(self,name): self.name = name self.class_obj_list = [] def add_classes(self,class_obj): """新增班级""" self.class_obj_list.append(class_obj) def add_course(self,cls_name,course_name, course_price): """为某一班级新增课程""" for cls in self.class_obj_list: if cls.name == cls_name: cls.course_obj_list.append(Course(course_name,course_price)) # 直接实例化添加对象 def show_classes(self): """查看班级信息""" print("[{0}]的班级信息如下".format(self.name)) for classes in self.class_obj_list: classes.show_classes_msg() #直接调用对象的方法 def show_course(self,cls_name): """通过输入班级名拿到其下所有课程信息""" for cls in self.class_obj_list: if cls.name == cls_name: cls.show_course() #直接调用对象的方法# ==== 添加学校 ===s1 = School("黄埔军校")# ==== 为学校添加班级 ====s1.add_classes(Classes("陆军1班","1927-01-28"))s1.add_classes(Classes("海军2班","1927-02-14"))# ==== 为班级添加课程 ===s1.add_course("陆军1班","坦克驾驶技术",19999)s1.add_course("海军2班","轰炸机驾驶技术",12888)# ==== 查看学校的班级信息 ====s1.show_classes()# ==== 查看班级的课程信息 ====s1.show_course("陆军1班")s1.show_course("海军2班")# ===- 执行结果 ===="""[黄埔军校]的班级信息如下班级的名字是:[陆军1班].班级的创建时间是[1927-01-28]班级的名字是:[海军2班].班级的创建时间是[1927-02-14][陆军1班]的课程信息如下:课程的名字是:[坦克驾驶技术].课程的价格是[19999][海军2班]的课程信息如下:课程的名字是:[轰炸机驾驶技术].课程的价格是[12888]"""
案例总结
通过上面的案例,我们可以发现在使用时确实变得非常简单,单纯的调某一个方法即可。但是设计时确实不太好设计,各位感兴趣的可以在此基础上做一些增加,比如老师,学生等等的类。