軟件重用的重要方式除了繼承以外還有另一種方式——組合。python
組合指的是,在一個類中以另一個類的對象(也就是實例)做爲數據屬性,稱爲類的組合。linux
也就是說,一個類的屬性是另外一個類的對象,就是組合。app
>>> class Equip: #武器裝備類 ... def fire(self): ... print('release Fire skill') ... >>> class Riven: #英雄Riven的類,一個英雄須要有裝備,於是須要組合Equip類 ... camp='Noxus' ... def __init__(self,nickname): ... self.nickname=nickname ... self.equip=Equip() #用Equip類產生一個裝備,賦值給實例的equip屬性 ... >>> r1=Riven('銳雯雯') >>> r1.equip.fire() #可使用組合的類產生的對象所持有的方法 release Fire skill
共性
ui
組合和繼承都是有效利用已有類資源的重要方式(代碼重用)。spa
差別code
繼承:創建派生類和基類間的關係,是一種「是」的關係。對象
組合:創建類與組合的類之間的關係,是一種「有」的關係。blog
適用狀況繼承
繼承:當類之間有不少相同的功能,提取這些共同的功能作成基類,用繼承比較好 ip
組合:當類之間有顯著不一樣,而且較小的類是較大的類所須要的組件時,用組合比較好。
class People: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex class Course: def __init__(self,name,period,price): self.name=name self.period=period self.price=price def tell_info(self): print('<%s %s %s>' %(self.name,self.period,self.price)) class Teacher(People): def __init__(self,name,age,sex,job_title): People.__init__(self,name,age,sex) self.job_title=job_title self.course=[] self.students=[] class Student(People): def __init__(self,name,age,sex): People.__init__(self,name,age,sex) self.course=[] egon=Teacher('egon',18,'male','沙河霸道金牌講師') s1=Student('牛榴彈',18,'female') python=Course('python','3mons',3000.0) linux=Course('python','3mons',3000.0) #爲老師egon和學生s1添加課程 egon.course.append(python) egon.course.append(linux) s1.course.append(python) #爲老師egon添加學生s1 egon.students.append(s1) #使用 for obj in egon.course: obj.tell_info()