前面講了面向類與對象的繼承,知道了繼承是一種什麼「是」什麼的關係。python
然而類與類之間還有另外一種關係,這就是組合函數
先來看兩個例子:
先定義兩個類,一個老師類,老師類有名字,年齡,出生的年,月和日,所教的課程等特徵以及走路,教書的技能。學習
class Teacher: def __init__(self,name,age,year,mon,day): self.name=name self.age=age self.year=year self.mon=mon self.day=day def walk(self): print("%s is walking slowly"%self.name) def teach(self): print("%s is teaching"%self.name)
再定義一個學生類,學生類有名字,年齡,出生的年,月和日,學習的組名等特徵以及走路,學習的技能code
class Student: def __init__(self,name,age,year,mon,day): self.name=name self.age=age self.year=year self.mon=mon self.day=day def walk(self): print("%s is walking slowly"%self.name) def study(self): print("%s is studying"%self.name)
根據類的繼承這個特性,能夠把代碼縮減一下。對象
定義一我的類,而後再讓老師類和學生類繼承人類的特徵和技能:繼承
class People: def __init__(self,name,age,year,mon,day): self.name=name self.age=age self.year=year self.mon=mon self.day=day def walk(self): print("%s is walking"%self.name) class Teacher(People): def __init__(self,name,age,year,mon,day,course): People.__init__(self,name,age,year,mon,day) self.course=course def teach(self): print("%s is teaching"%self.name) class Student(People): def __init__(self,name,age,year,mon,day,group): People.__init__(self,name,age,year,mon,day) self.group=group def study(self): print("%s is studying"%self.name)
再對老師和學生進行實例化,獲得一個老師和一個學生。字符串
t1=Teacher("alex",28,1989,9,2,"python") s1=Student("jack",22,1995,2,8,"group2")
如今想知道t1和s1的名字,年齡,出生的年,月,日都很容易,可是想一次性打印出
t1或s1的生日就不那麼容易了,這時就須要用字符串進行拼接了,有沒有什麼更好的辦法呢??it
那就是組合。class
繼承是一個子類是一個父類的關係,而組合則是一個類有另外一個類的關係。
能夠說每一個人都有生日,而不能說人是生日,這樣就要使用組合的功能 。
能夠把出生的年月和日另外再定義一個日期的類,而後用老師或者是學生與這個日期的類
組合起來,就能夠很容易得出老師t1或者學生s1的生日了,不再用字符串拼接那麼麻煩了。
來看下面的代碼:object
class Date: def __init__(self,year,mon,day): self.year=year self.mon=mon self.day=day def birth_info(self): print("The birth is %s-%s-%s"%(self.year,self.mon,self.day)) class People: def __init__(self,name,age,year,mon,day): self.name=name self.age=age self.birth=Date(year,mon,day) def walk(self): print("%s is walking"%self.name) class Teacher(People): def __init__(self,name,age,year,mon,day,course): People.__init__(self,name,age,year,mon,day) self.course=course def teach(self): print("%s is teaching"%self.name) class Student(People): def __init__(self,name,age,year,mon,day,group): People.__init__(self,name,age,year,mon,day) self.group=group def study(self): print("%s is studying"%self.name) t1=Teacher("alex",28,1989,9,2,"python") s1=Student("jack",22,1995,2,8,"group2")
這樣一來,可使用跟前面同樣的方法來調用老師t1或學生s1的姓名,年齡等特徵
以及走路,教書或者學習的技能。
print(t1.name) t1.walk() t1.teach()
輸出爲:
alex alex is walking alex is teaching
那要怎麼可以知道他們的生日呢:
print(t1.birth)
輸出爲:
<__main__.Date object at 0x0000000002969550>
這個birth是子類Teacher從父類People繼承過來的,而父類People的birth又是與Date這個類組合在一
起的,因此,這個birth是一個對象。而在Date類下面有一個birth_info的技能,這樣就能夠經過
調用Date下面的birth_info這個函數屬性來知道老師t1的生日了。
t1.birth.birth_info()
獲得的結果爲:
The birth is 1989-9-2
一樣的,想知道實例學生s1的生日也用一樣的方法:
s1.birth.birth_info()
獲得的結果爲:
The birth is 1995-2-8
組合就是一個類中使用到另外一個類,從而把幾個類拼到一塊兒。組合的功能也是爲了減小重複代碼。