python中super().__init__()的用法
super().__ init__ ()有什么用?
super().__init__() 、 super(B,self).__init__()
1、分別理解super()和 __ init __()
1.1、super()
需要注意的是python2、3的super寫法稍有不同。
1.2、__ init __()
__init__() 是python中的構(gòu)造函數(shù),在創(chuàng)建對(duì)象的時(shí)"自動(dòng)調(diào)用"。
定義類時(shí)可以不寫init方法,系統(tǒng)會(huì)默認(rèn)創(chuàng)建, 你也可以寫一個(gè),讓你的類在創(chuàng)建時(shí)完成一些“動(dòng)作”。
1.3、super(). __ init __()
如果子類B和父類A,都寫了init方法,
那么A的init方法就會(huì)被B覆蓋。想調(diào)用A的init方法需要用super去調(diào)用。
當(dāng)然,在B內(nèi)部,除了用super調(diào)用父類的方法,也可以用父類名調(diào)用,例:
class B(A): def __init__(self): A.__init__(self) print("B init")
1.3.1、關(guān)于“覆蓋”的疑問(wèn)
有人可能會(huì)誤解“覆蓋”的意思,認(rèn)為“覆蓋”了就是沒(méi)有,為什么還能通過(guò)super調(diào)用?
覆蓋了并不是沒(méi)有了,A的方法終都還在,但需要在B內(nèi)部用super調(diào)用。
例: A里寫了一個(gè)方法hi(), B繼承自A, B里也寫了一個(gè)方法hi()。 B的對(duì)象在外部調(diào)用hi(), 就只能調(diào)用B里面寫的這個(gè)hi()。 想通過(guò)B調(diào)用A的hi(),只能在B內(nèi)部用super().hi()調(diào)用。
class A: def hi(self): print("A hi") class B(A): def hello(self): print("B hello") b = B() b.hi() # B里沒(méi)有寫hi(),這里調(diào)用的是繼承自A的hi() ------------------------------------------------------------------ class A: def hi(self): print("A hi") class B(A): def hi(self): print("B hi") b = B() b.hi() # 這里調(diào)用的就是B自己的hi() ------------------------------------------------------------------ class A: def hi(self): print("A hi") class B(A): def hi(self): super().hi() # 通過(guò)super調(diào)用父類A的hi() print("B hi") b = B() b.hi() # 這里調(diào)用的就是B里面的hi()
2、super() 在 python2、3中的區(qū)別
Python3.x 和 Python2.x 的一個(gè)區(qū)別: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
例:
python3 直接寫成 : super().__init__()
python2 必須寫成 :super(本類名,self).__init__()
Python3.x 實(shí)例:
class A: def add(self, x): y = x+1 print(y) class B(A): def add(self, x): super().add(x) b = B() b.add(2) # 3
Python2.x 實(shí)例:
#!/usr/bin/python # -*- coding: UTF-8 -*- class A(object): # Python2.x 記得繼承 object def add(self, x): y = x+1 print(y) class B(A): def add(self, x): super(B, self).add(x) b = B() b.add(2) # 3
3、關(guān)于繼承順序
最底層:先寫一個(gè)父類A
class A: def __init__(self): print('A')
第二層:讓 B、C、D 繼承自A
class B(A): def __init__(self): print('B') super().__init__() class C(A): def __init__(self): print('C') super().__init__() class D(A): def __init__(self): print('D') super().__init__()
第三層: E、F、G 繼承
class E(B, C): def __init__(self): print('E') super().__init__() class F(C, D): def __init__(self): print('F') super().__init__() class G(E, F): def __init__(self): print('G') super().__init__()
看看G的繼承順序
我們發(fā)現(xiàn)G繼承自E, F是并列的,初始化的時(shí)候不會(huì)先把E初始化完畢才初始化F。
4、從多個(gè)實(shí)例中對(duì)比super(python3)
下面是三種不同的繼承、調(diào)用,對(duì)比他們的區(qū)別,搞清楚super().__init__()的用途。
4.1、實(shí)例
子類名稱 | 繼承內(nèi)容 |
---|---|
Puple | 繼承所有 |
Puple_Init | 繼承,但覆蓋了init方法 |
Puple_Super | 繼承,但覆蓋了init方法,并在init里面添加了super().__init__() |
4.2、運(yùn)行結(jié)果與對(duì)比
4.3、完整代碼
到此這篇關(guān)于python中super().__init__()的用法的文章就介紹到這了,更多相關(guān)super().__init__()的用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python讀取Excel一列并計(jì)算所有對(duì)象出現(xiàn)次數(shù)的方法
這篇文章主要給大家介紹了關(guān)于Python讀取Excel一列并計(jì)算所有對(duì)象出現(xiàn)次數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09PyQt5實(shí)現(xiàn)五子棋游戲(人機(jī)對(duì)弈)
這篇文章主要為大家詳細(xì)介紹了PyQt5實(shí)現(xiàn)五子棋游戲,人機(jī)對(duì)弈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01python實(shí)現(xiàn)簡(jiǎn)單的俄羅斯方塊
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單的俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01python自動(dòng)化測(cè)試之setUp與tearDown實(shí)例
這篇文章主要介紹了python自動(dòng)化測(cè)試之setUp與tearDown實(shí)例,其中setUp()方法中進(jìn)行測(cè)試前的初始化工作,并在tearDown()方法中執(zhí)行測(cè)試后的清除工作,setUp()和tearDown()都是TestCase類中定義的方法,需要的朋友可以參考下2014-09-09Python+MongoDB自增鍵值的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇Python+MongoDB自增鍵值的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11python 迭代器和iter()函數(shù)詳解及實(shí)例
這篇文章主要介紹了python 迭代器和iter()函數(shù)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03使用python實(shí)現(xiàn)時(shí)間序列白噪聲檢驗(yàn)方式
這篇文章主要介紹了使用python實(shí)現(xiàn)時(shí)間序列白噪聲檢驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06