繼承斥废。屬于面向?qū)ο蟮倪M一步抽象。
為何說是進一步抽象呢给郊?在使用面向?qū)ο缶幊痰臅r候牡肉,也就是寫類的時候,發(fā)現(xiàn)很多類中有共同的內(nèi)容(屬性和方法)丑罪,這樣又變成了重復(fù)編碼了荚板,能不能減少一點代碼呢?
比如吩屹,我們寫一個教師類跪另,有姓名、年齡煤搜、身高免绿、教師編號等屬性,有講課擦盾、吃飯嘲驾、睡覺淌哟、打豆豆等行為(方法);然后寫一個學(xué)生類辽故,有姓名徒仓、年齡、身高誊垢、學(xué)號等屬性掉弛,有學(xué)習(xí)、吃飯喂走、睡覺殃饿、打豆豆等行為;寫一個老司機類芋肠,有姓名乎芳、年齡、身高帖池、駕駛證號等屬性奈惑,有開車、吃飯碘裕、睡覺携取、打豆豆等行為攒钳。
細想一下帮孔,是不是大家都有姓名、年齡不撑、身高等屬性文兢,也共同擁有吃飯、睡覺焕檬、打豆豆等行為姆坚?那么是不是在描述的時候我們只用單獨描述他們特殊的屬性和行為,而這些共同的屬性和行為都可以歸類到人類中呢实愚?
當然可以兼呵,這就是繼承啦。將子類們共有的屬性和方法抽象到父類(超類)中腊敲,子類們只需要通過繼承父類击喂,就能擁有這些共有的屬性了。
繼承可以使得子類具有父類的屬性和方法或者重新定義碰辅、追加屬性和方法等懂昂。
- 子類擁有父類的特征,而父類沒有没宾。父類更通用凌彬,子類更具體沸柔;
- 通過子類繼承父類,子類擁有父類的所有屬性和方法(私有的除外)铲敛;
- 子類可以擁有自己獨特的屬性和方法褐澎。
# 定義人類類
class Person():
def __init__(self, name, age, height, number):
self.name = name
self.number = number
self.age = age
self.height = height
def talk(self, who):
print('%s在和%s說話' % (self.name, who))
def hit_doudou(self):
print('%s正在打豆豆...' % self.name)
# 下面寫一個學(xué)生類繼承人類
class Student(Person): # 繼承的寫法:在類申明的時候,括號中寫需要繼承的父類名
def __init__(self, class_, name, age, height, number):
# 學(xué)生除了人類中定義的屬性伐蒋,還有班級屬性
self.class_ = class_
super().__init__(name, age, height, number)
# super()函數(shù)乱凿,如果重寫了父類的方法,你在子類中又需要父類的方法
# 就需要使用super()函數(shù)咽弦,重新調(diào)用父類的同名方法徒蟆。
def talk(self): # 重寫父類的同名方法
print('%s在討論學(xué)習(xí)' % self.name)
def study(self):
print('%s正在學(xué)習(xí)英語...' % self.name)
# 寫一個教師類,繼承自人類
class Teacher(Person):
# 只定義了一個講課方法
# 其余方法都繼承自父類
def teach(self):
# 調(diào)用父類的屬性
print('%s在講課'% self.name)
# 實例化子類
s = Stuent('一年級二班', '豆豆', 7, 40, '13101')
s.hit_doudou() # 子類對象調(diào)用父類的方法
通過繼承型型,子類擁有父類中的所有屬性和方法段审。
- 子類可以在定義方法時調(diào)用父類的屬性和方法;
- 子類的對象可以訪問父類的屬性和方法闹蒜;
- 子類如果對某些方法有更具體的定義寺枉,可以重寫父類的方法。
重寫:如果子類和父類有同名的方法绷落,就認為這是重寫姥闪。
那么這個時候在子類或子類對象調(diào)用的時候,會以子類為準砌烁,我們這種情況就是子類重寫了筐喳。這也就是所謂的父類更通用、子類更具體函喉。
super():重寫了父類的方法避归,而在子類中又需要用到父類的方法」芎牵可以使用該函數(shù)調(diào)用父類的方法梳毙。
主要用于__init__
方法,當你子類需要添加實例屬性時捐下,必定要重寫__init__
方法账锹,但是重寫后父類的__init__
方法會被覆蓋,父類中的實例屬性就沒有了坷襟,于是需要在子類中重寫__init__
方法后需要再調(diào)用父類的方法以保證父類的屬性奸柬。