软件重用的重要方式除了继承之外还有另外一种方式,即:组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
1.继承的方式(什么是什么的关系)
通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人
2.组合的方式(什么有什么的关系)
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...
class People: school = "Luffycity" def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex class Teacher(People): def __init__(self,name,age,sex,level,salary): super().__init__(name,age,sex) self.level = level self.salary = salary def teach(self): print("%s is teaching" % self.name) class Student(People): def __init__(self,name,age,sex,class_time): super().__init__(name,age,sex) self.class_time = class_time def learn(self): print("%s is learning" % self.name) 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_info(self): print("课程名:%s 课程价格:%s 课程周期:%s" %(self.course_name,self.course_price,self.course_period)) class Date: # 生日类,学生类、老师类都有生日类,但学生类、老师类不是生日类,所以用组合 def __init__(self,year,mon,day): self.year = year self.mon = mon self.day = day def tell_info(self): print("%s-%s-%s" %(self.year,self.mon,self.day)) teacher1 = Teacher("alex",18,"male",10,3000) student1 = Student("张三",26,"female","08:30:00") # 创建学生对象 python = Course("Python",8999,6) # 创建课程对象 date1 = Date(1994,1,10) # 创建生日对象 student1.course = python # 创建学生的course属性(属性名称是自己起的),令这个属性指向python这个课程对象,这就是组合的过程 student1.birthday = date1 # 创建学生的birthday属性指向date1这个对象,这样不相关的两个类就组合起来了 student1.course.tell_info() # 调用tell_info()方法 student1.birthday.tell_info()
总结:
当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好