大家好,我是金魚座,一個(gè)走在測試領(lǐng)域這片藍(lán)海中, 蹉跎前行的技術(shù)渣渣,唯有一直走下去,也許能改變點(diǎn)什么,加油!
類繼承可以說是所有面向?qū)ο笳Z言的一個(gè)最重要組成部分,python當(dāng)然不可能缺少這樣的重要內(nèi)容
那么為什么我會(huì)將類繼承單獨(dú)拿出來說呢, 主要是給自己再一次加深理解,作為一個(gè)職業(yè)非主力開發(fā)的測試來說,我們很多時(shí)候?qū)τ谡Z言的理解都是浮于表面,只要稍微進(jìn)行一些變種,就會(huì)一頭霧水,我也希望跟我有一樣感覺的人,能夠通過我寫的這個(gè)加深理解
先說下對(duì)于普通的一個(gè)類定義是這樣的:
class A():
def __init__(self, a):
self.a = a
pass
再說下我遇到的幾種情況
1. 繼承父類時(shí), 子類沒有init初始化
class C(A):
pass
此時(shí)聲明一個(gè)C = C()時(shí),會(huì)報(bào)錯(cuò)

原因是繼承A后, A初始化有個(gè)a參數(shù), 此時(shí)需要定義c = C(3)
結(jié)論:子類不重寫 init,實(shí)例化子類時(shí),會(huì)自動(dòng)調(diào)用父類定義的 init。
2. 繼承父類時(shí), 子類有自己獨(dú)立的初始化init
class B(A):
def __init__(self, b):
self.b = b
pass
此時(shí)聲明:b = B(2)時(shí), 2會(huì)自動(dòng)賦值給b,可以通過b.b來進(jìn)行輸出

子類不需要自動(dòng)調(diào)用父類的方法:子類重寫init()方法,實(shí)例化子類后,將不會(huì)自動(dòng)調(diào)用父類的init()的方法。
3. 繼承父類時(shí),需要繼承父類的初始化init也有自己的init
class B(A):
def __init__(self, b):
A.__init__(self, 2)
super(B, self).__init__(2)
self.b = b
pass
上述的兩種super和A的鏈?zhǔn)揭枚伎梢?br> 此時(shí)聲明:b = B(1)時(shí), b.b = 1, b.a = 2
結(jié)論 如果重寫了init 時(shí),要繼承父類的構(gòu)造方法,可以使用 super(子類,self).init(參數(shù)1,參數(shù)2,....), 或者 父類名稱.init(self,參數(shù)1,參數(shù)2,...)
通過上面的三種情況, 我們可以看出, python的繼承并不能直接引用父類的初始化參數(shù),必須通過一定的處理,才能做到成功引用