组合与重用性

软件重用的重要方式除了继承之外还有另外一种方式,即:组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合


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()

总结:

当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好

原文地址:https://www.cnblogs.com/nanjo4373977/p/12176557.html