一、什么是組合
- 組合就是一個類的對象具備某一個屬性,該屬性的值是指向另外外一個類的對象
二、為什么用組合
-
組合是用來解決類與類之間代碼冗余的問題
-
首先我們先寫一個簡單版的選課系統
class OldboyPeople:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class OldboyStudent(OldboyPeople):
def __init__(self, name, age, sex, stu_id):
OldboyPeople.__init__(self, name, age, sex)
self.stu_id = stu_id
def choose_course(self):
print('%s is choosing course' % self.name)
class OldboyTeacher(OldboyPeople):
def __init__(self, name, age, sex, level):
OldboyPeople.__init__(self, name, age, sex)
self.level = level
def score(self, stu, num):
stu.score = num
print('老師[%s]為學生[%s]打分[%s]' % (self.name, stu.name, num))
stu1 = OldboyStudent('tank', 19, 'male', 1)
tea1 = OldboyTeacher('nick', 18, 'male', 10)
stu1.choose_course()
tank is choosing course
tea1.score(stu1, 100)
老師[nick]為學生[tank]打分[100]
print(stu1.__dict__)
{'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1, 'score': 100}
- 如上設計了一個選課系統,但是這個選課系統在未來一定是要修改、擴展的,因此我們需要修改上述的代碼
三、如何用組合
-
需求:假如我們需要給學生增添課程屬性,但是又不是所有的老男孩學生一進學校就有課程屬性,課程屬性是學生來老男孩后選出來的,也就是說課程需要后期學生們添加進去的
-
實現思路:如果我們直接在學生中添加課程屬性,那么學生剛被定義就需要添加課程屬性,這就不符合我們的要求,因此我們可以使用組合能讓學生未來添加課程屬性
class Course:
def __init__(self, name, period, price):
self.name = name
self.period = period
self.price = price
def tell_info(self):
msg = """
課程名:%s
課程周期:%s
課程價錢:%s
""" % (self.name, self.period, self.price)
print(msg)
class OldboyPeople:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class OldboyStudent(OldboyPeople):
def __init__(self, name, age, sex, stu_id):
OldboyPeople.__init__(self, name, age, sex)
self.stu_id = stu_id
def choose_course(self):
print('%s is choosing course' % self.name)
class OldboyTeacher(OldboyPeople):
def __init__(self, name, age, sex, level):
OldboyPeople.__init__(self, name, age, sex)
self.level = level
def score(self, stu, num):
stu.score = num
print('老師[%s]為學生[%s]打分[%s]' % (self.name, stu.name, num))
# 創造課程
python = Course('python全棧開發', '5mons', 3000)
python.tell_info()
課程名:python全棧開發
課程周期:5mons
課程價錢:3000
linux = Course('linux運維', '5mons', 800)
linux.tell_info()
課程名:linux運維
課程周期:5mons
課程價錢:800
# 創造學生與老師
stu1 = OldboyStudent('tank', 19, 'male', 1)
tea1 = OldboyTeacher('nick', 18, 'male', 10)
- 組合
# 將學生、老師與課程對象關聯/組合
stu1.course = python
tea1.course = linux
stu1.course.tell_info()
課程名:python全棧開發
課程周期:5mons
課程價錢:3000
tea1.course.tell_info()
課程名:linux運維
課程周期:5mons
課程價錢:800
- 組合可以理解成多個人去造一個機器人,有的人造頭、有的人造腳、有的人造手、有的人造軀干,大家都完工后,造軀干的人把頭、腳、手拼接到自己的軀干上,因此一個機器人便造出來了