组合

什么是组合

组合就是对象的某个属性是另一个类的对象

class Foo:
    def __init__(self,bar):
        self.bar=bar
        
class Bar:
    pass

bar=Bar()
f=Foo(bar)

为什么使用组合

组合可以减少代码冗余

class Person:
    school='xxx'
    
class Teacher(Person):
    def __init__(self,name,age,level,course_name,course_price,course_period):
        self.name=name
        self.age=age
        self.level=level
        
class Student(Person):
    def __init__(self,name,age,course,course_name,course_price,course_period):
        self.name=name
        self.age=age
        self.course=course
        
#通过组合解决代码冗余
class Person:
    school='xxx'

class Teacher(Person):
    def __init__(self,name,age,level,course):
        self.name=name
        self.age=age
        self.level=level
        # course是课程对象,表示老师教授的课程
        self.course=course

class Student(Person):
    def __init__(self,name,age,course):
        self.name=name
        self.age=age
        # course是课程对象,表示学生选的课程
        self.course=course

class Course:
    def __init__(self,course_name,course_price,course_period):
        self.name=course_name
        self.price=course_price
        self.period=course_period

course=Course('python',20189,7)
stu=Student('nick',18,course)
print(stu.course.price)

如何使用组合

class Person:
    school='xxx'
class Teacher(Person):
    def __init__(self,name,age,level,course):
        self.name=name
        self.age=age
        self.level=level
        # course是课程对象,表示老师教授的课程
        self.course=course

class Student(Person):
    def __init__(self,name,age):
        self.name=name
        self.age=age
        # course是课程对象,表示学生选的课程
        self.course_list=[]
    def choose_course(self,course):
        # self.course=[]  #错误
        # 把课程对象追加到学生选课的列表中
        self.course_list.append(course)
    def tell_all_course(self):
        # 循环学生选课列表,每次拿出一个课程对象
        for course in self.course_list:
            print(course.name)

class Course:
    def __init__(self,course_name,course_price,course_period):
        self.name = course_name
        self.price = course_price
        self.period = course_period

course=Course('python',20101,7)
stu1=Student('nick',19)
stu1.choose_course(course)
stu2=Student('王二丫',19)
stu2.choose_course(course)
stu2.choose_course(Course('linux',19999,5))
#查看stu1选的所有课程名称
#方式一(通过普通函数)
def tell_all_course(student):
    for course in student.course_list:
        print(course.name)
tell_all_course(stu1)
tell_all_course(stu2)
#方式二(通过对象的绑定方法)
stu1.tell_all_course()
stu2.tell_all_course()
原文地址:https://www.cnblogs.com/aden668/p/11424985.html