繼承外另外一種重用方式——組合

1、組合概念

  軟件重用的重要方式除了繼承以外還有另一種方式——組合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

2、繼承和組合對比

共性
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()
相關文章
相關標籤/搜索