1、含义:组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合。
class Gun:
'''武器装备类'''
def fire(self):
print("be equiped")
class Hero:
'''定义英雄类,需要给英雄提供装备,因此需要组合Gun类'''
camp = 'Galen'
def __init__(self,nickname):
self.nickname = nickname
self.equip = Gun() # 用Gun类实例化一件装备,赋值给实例的equip属性
hero1 = Hero('盖伦')
hero1.equip.fire()
2、组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景不同。
<1>继承的方式
通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如猫是动物,人是动物。
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人。
<2>组合的方式
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,学生有课程,老师有课程。
示例:
class People:
school = 'hgnc'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class Teacher(People):
def __init__(self,name,age,sex,salary):
super().__init__(name,age,sex) # 继承
self.salary = salary # 派生
class Student(People):
def __init__(self,name,age,sex,tuition):
super().__init__(name,age,sex) # 继承
self.tuition = tuition # 派生
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 course_info(self):
print('课程《%s》 课程价格《%s》 课程周期《%s》 '%(self.course_name,self.course_price,self.course_period))
teacher1 = Teacher('夕雨',23,'女',6000) #
student1 = Student('十月',21,'男',4000)
student2 = Student('九月',20,'女',4000)
course1 = Course('Python',3000,'6mons')
course2 = Course('Linux',4000,'4mons')
teacher1.course = course1 # 将对象增加的某一属性定义为另一对象,使之可使用另一对象的功能,即组合
student1.course = course1
student2.course = course2
print(teacher1.__dict__) # 查看对象属性
print(student1.__dict__)
print(teacher1.course.course_name) # Python
print(student1.course.course_period) # 6mons
print(student2.course.course_price) # 4000
student1.course.course_info() # 课程《Python》 课程价格《3000》 课程周期《6mons》
3、组合适用的场合
当类之间有显著不同时,而且较小的类是较大的类所需要的组件时,用组合比较好。