面向对象 组合
# 组合 : 就是一个对象拥有一个属性,该属性的值是另外一个对象
'对象.属性 = 另一个对象'
目的: 解决类与类之间的代码冗余问题
1.继承:满足什么是什么的关系,is-a的关系 # (继承是一把双刃剑,并不是继承的多就好)
2.组合:组合表达是has-a关系: 一个对象拥有一个属性,该属性值指向另外一个对象
eg:
class Foo():
def __init__(self, m):
self.m = m
class Bar():
def __init__(self, n):
self.n = n
obj = Foo(10)
obj1 = Bar(20)
obj.x = obj1 # 这就属于组合
print(obj.__dict__) # {'m': 10, 'x': <__main__.Bar object at 0x000001B0B6CBA4E0>}
# 这样就可以通过obj对象即可以拿到Foo的属性和方法 也可以拿到Bar的属性属性和方法(超级对象)
class People():
school = 'SS'
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
class Admin(People):
pass
class Course():
def __init__(self, name, period, price):
self.name = name
self.period = period
self.price = price
python = Course('python', '6mon', 2000)
linux = Course('linux', '5mon', 3000)
class Student(People, Course):
def __init__(self, name, age, gender, course=None):
if course is None:
course = []
self.courses = course
super().__init__(name, age, gender, )
def choose_course(self, stu_obj, course):
stu_obj.courses.append(course)
stu = Student('gary', 20 , 'male') # 没有给course传值 所有为一个空列表
stu.courses.append(python) # 这里就是组合 属性的值是另一个对象
stu.courses.append(linux)
for course in stu.courses:
print(course.price)
print(course.name)