python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...
第8.3節Python類的__init__方法深入剖析:構造方法與繼承詳解
一、?? ?引言
上兩節介紹了構造方法的語法及參數,說明了構造方法是Python的類創建實例后首先執行的方法,并說明如果類沒有重寫構造方法,Python將會給出默認的__init__方法。上述介紹適用于自定義類沒有自定義父類的情況,如果自定義類是從其他自定義類派生的,又會怎樣呢?
二、?? ?構造方法與繼承
為了保障相關邏輯的正確性,在子類重寫構造方法時,必須調用超類(繼承的類)的構造方法,否則可能無法正確地初始化對象。
1.?? ?子類在構造方法處理時,可以有兩種方法:
1>?? ?繼承后不重寫構造方法,此時子類直接繼承了父類的構造方法;
2>?? ?重寫父類構造方法,在子類的構造方法里顯式地調用父類的構造方法,對調用執行的具體代碼位置沒有要求,可以在子類構造方法的開始部分、中間部分或結尾部分都可以,主要看業務邏輯有沒有要求。
這兩種方法都可以確保子類繼承父類時構造方法的正確性。
2.?? ?子類里顯示調用父類的構造方法的三種實現方式
1>?? ?父類名.父類構造方法,這種方法需要注意,self參數必須傳給父類方法;
2>?? ?super().父類構造方法,這種方法調用不需要也不能傳遞self參數,由Python自動傳入;
3>?? ?super(子類名,self).父類構造方法,這種方法調用也不需要傳遞self參數。
以上三種方法,老猿推薦大家使用第二種,一是使用簡單,不需要給出父類名或子類名,也不需要self參數傳遞,二是程序修改簡單,如果父類或子類名修改無需修改相關代碼。不過這種方法只有Python3以后才支持。
三、?? ?案例
1.?? ?案例說明:
本節使用一個繼承案例,超類為Vehicle(車),子類為car(小汽車),車只有3個實例變量:wheelcount(輪子數)、power(動力)、行駛總里程totaldistance,子類根據情況不同會有不同的實例變量,最多增加一個實例變量每公里油耗oilcostperkm(使用時錯誤,后面賦值時是按百公里油耗賦值的,特此說明)。為了聚焦問題,在類內都只定義構造方法,超類的類定義如下:
class Vehicle():
def __init__(self,wheelcount, power):
self.wheelcount,self.power,self.totaldistance = wheelcount,power,0
2.?? ?案例1:子類不重寫構造方法
1)?? ?子類定義如下:
class Car(Vehicle):pass
此時應該繼承父類的構造方法。
2)?? ?沒有寫構造方法,不帶參數執行實例定義,系統應報錯
car=Car()
3)?? ?按父類要求定義實例
car=Car(4,'汽油發動機') #帶正確參數執行
4)?? ?案例截圖:
5)?? ?案例總結:
子類繼承父類構造方法,執行實例定義時直接執行該構造方法。
3.?? ?案例2:子類重寫構造方法但子類構造方法中不調用父類構造方法
1)?? ?子類定義如下:
class Car(Vehicle): ?#子類重寫構造方法但子類構造方法中不調用父類構造方法
def __init__(self,wheelcount, power,oilcostperkm):
self.oilcostperkm = oilcostperkm
print("In Car __init__:oilcostperkm=",self.oilcostperkm)。
2)?? ?定義實例
car=Car(4,'汽油發動機',10)
3)?? ?查看實例數據
car.__dict__ #查看實例自定義屬性,應該只有oilcostperkm
car.wheelcount #查看實例的?? ?wheelcount,應報錯
4)?? ?案例截圖:
5)?? ?案例總結:
子類重寫構造方法,如果沒有顯示調用父類構造方法,則不會執行父類構造方法的相關代碼。
4.?? ?案例3:子類重寫構造方法并調用父類構造方法
1)?? ?子類定義如下:
class Car(Vehicle): ?#子類重寫構造方法但子類構造方法中不調用父類構造方法
def __init__(self,wheelcount, power,oilcostperkm):
self.oilcostperkm = oilcostperkm
print("In Car __init__:oilcostperkm=",self.oilcostperkm)
super().__init__(wheelcount, power)
調用父類的構造方法,本例中用的這是一種老猿推薦的調用方法,還可以有下面兩種調用方法:
Vehicle.__init__(self,wheelcount, power)
super(Car,self).__init__(wheelcount, power)
2)?? ?定義實例和查看數據
car=Car(4,'汽油發動機',10) #應該執行兩個構造方法
car.__dict__ #查看實例自定義屬性,應該wheelcount, power,oilcostperkm都有
car.wheelcount #查看實例的?? ?wheelcount,應正常給出
3)?? ?案例截圖:
4)?? ?案例總結:子類重寫構造方法,顯示調用父類構造方法,相關實例變量都會正常初始化。
本節結合案例詳細介紹了在繼承情況下應該怎么實現子類的構造方法,內容比較簡單但很重要,請大家注意。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介紹老猿學習Python后總結的學習經驗,這些經驗有助于沒有接觸過Python的程序員可以很容易地進入Python的世界。
歡迎大家批評指正,謝謝大家關注!
總結
以上是生活随笔為你收集整理的python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python socket udp并发_
- 下一篇: python默认数据转换_Python_