在一个类中以另外一个类的对象作为数据属性,称为类的组合。
组合和继承都是有效利用已有类的资源的重要方式。区别:
继承:通过继承建立了派生类和基类之间的关系,是一种“是”的关系。当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好。例如:学生是人,老师是人。
组合:用组合的方式建立了类与组合之间的关系,是一种“有”的关系。例如:人有生日,老师有课程
当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好。
class People:
school = "university"
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(Teacher, self).__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(Student, self).__init__(name,age,sex)
self.class_time = class_time
def learn(self):
print("%s is learning" % self.name)
class Course:
def __init__(self,name,price,period):
self.course_name = name
self.course_price = price
self.course_period = 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",20,"male",10,3000)
# python = Course("python",3000,"3months")
# linux = Course("linux",2000,"4months")
#
# teacher1.course = python # 让老师有了一个属性,指向课程
# print(teacher1.course.course_name)
# teacher1.course.tell_info()
#
# student = Student("张三",28,"female","8:00")
# student.course1 = python
# student.course2 = linux
# student.course1.tell_info()
# student.course2.tell_info()
# student.courses=[]
# student.courses.append(python)
# student.courses.append(linux)
# for i in student.courses:
# print(i.__dict__)
student = Student("张三",28,"female","8:00")
d = Date(1988,4,20)
student.birth = d # 组合
student.birth.tell_info()