Python:繼承·派生·覆蓋·super函式
阿新 • • 發佈:2018-11-06
繼承inheritnce和派生derived
什麼是繼承/派生
派生就是從一個已有的類中衍生成新類
繼承是指在衍生出的新類中的物件會擁有原類的屬性和行為
作用:
用繼承派生機制,可以將一些共有功能加在基類中,實現程式碼共享
在不改變基類程式碼的基礎上,改變原有類的功能
名詞:
基類(base class)/超類(super class)父類(father class)
派生類(derived class)/子類(child class)
單繼承:
語法: class 類名(基類名): 語句塊 說明: 單繼承是指派生類由一個基類衍生出來的類 class human: def say(self,what): print('say',what) def walk(self,distance): print('走了',distance,'公里') class student(human): #(human)後加的 # def say(self,what): # print('說',what) # def walk(self,distance): # print('走了',distance,'公里') def study(self,subiect): print('學習',subiect) h1=human() h1.say('天亮了') h1.walk(5) print('...............................') s1=student() s1.walk(4) s1.say('感覺有點累') s1.study('面向物件') **繼承說明:** Python3中任何類都直接或間接地繼承自object類 object類是一切類的超類 類的__base__屬性 __base__屬性用來記錄此類的基類 python內建類的繼承關係 >>>help(__butltins__)
覆蓋override
覆蓋是指在有繼承關係的類中,子類中實現了與基類同名的方法,在子類的實 例呼叫該方法時,實際呼叫的是子類的覆蓋版本,這種現象叫做覆蓋 作用: 實現和父類同名,但功能不同的方法 示例: class A: def work(self): print('A.work被呼叫') class B(A): def work(self): '''此方法會覆蓋父類中同名的方法''' print('B.work被呼叫') b=B() b.work() **問題:** 當覆蓋發生時,如何呼叫父類的被覆蓋方法 此例項示意顯示呼叫父類的顯式方法: class A: -\ def work(self): \ print('A.work被呼叫') \ class B(A): \ def work(self): \ 不推薦 '''此方法會覆蓋父類中同名的方法''' / 使用 print('B.work被呼叫') / pass / b=B() / #b.work() / A.work(b) -/
super函式
super(cls,obj)返回繫結超類的例項(要求obj必須是cls類或者cls子類的物件) super()返回繫結超類的例項,等同於: super(__class__,例項方法的第一個引數),必須用在方法內呼叫 作用: 藉助super()返回的例項間接呼叫父類的覆蓋方法 示例: class A: def work(self): print('A.work被呼叫') class B(A): def work(self): '''此方法會覆蓋父類中同名的方法''' print('B.work被呼叫') pass b=B() super(B,b).work() super的應用 顯示呼叫基類的初始化方法 當子類中實現了__init__方法,基類的__init__方法 將不會被自動呼叫。如果需要呼叫,則需要用super顯式呼叫 class human: def __init__(self,n,a): print('__init__被呼叫' ,n,a) self.name=n self.age=a #顯式呼叫object類的__init__方法 super().__init__() def infos(self): print('姓名',self.name) print('年齡',self.age) class student(human): def __init__(self,n,a,s=0): super().__init__(n,a) self.score=s def infos(self): super().infos() print('成績',self.score) h1=student('小李',18) # h1=human('小張', 20) h1.infos()