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)建對象的時"自動調(diào)用"。

定義類時可以不寫init方法,系統(tǒng)會默認(rèn)創(chuàng)建, 你也可以寫一個,讓你的類在創(chuàng)建時完成一些“動作”。
1.3、super(). __ init __()
如果子類B和父類A,都寫了init方法,
那么A的init方法就會被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)于“覆蓋”的疑問
有人可能會誤解“覆蓋”的意思,認(rèn)為“覆蓋”了就是沒有,為什么還能通過super調(diào)用?
覆蓋了并不是沒有了,A的方法終都還在,但需要在B內(nèi)部用super調(diào)用。
例: A里寫了一個方法hi(), B繼承自A, B里也寫了一個方法hi()。 B的對象在外部調(diào)用hi(), 就只能調(diào)用B里面寫的這個hi()。 想通過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里沒有寫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() # 通過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 的一個區(qū)別: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
例:
python3 直接寫成 : super().__init__()
python2 必須寫成 :super(本類名,self).__init__()
Python3.x 實例:
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 實例:
#!/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)于繼承順序
最底層:先寫一個父類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是并列的,初始化的時候不會先把E初始化完畢才初始化F。
4、從多個實例中對比super(python3)
下面是三種不同的繼承、調(diào)用,對比他們的區(qū)別,搞清楚super().__init__()的用途。
4.1、實例

| 子類名稱 | 繼承內(nèi)容 |
|---|---|
| Puple | 繼承所有 |
| Puple_Init | 繼承,但覆蓋了init方法 |
| Puple_Super | 繼承,但覆蓋了init方法,并在init里面添加了super().__init__() |
4.2、運(yùn)行結(jié)果與對比

4.3、完整代碼

到此這篇關(guān)于python中super().__init__()的用法的文章就介紹到這了,更多相關(guān)super().__init__()的用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vscode autopep8無法格式化python代碼問題解決
這篇文章主要為大家介紹了vscode autopep8無法格式化python代碼問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Python內(nèi)置方法實現(xiàn)字符串的秘鑰加解密(推薦)
在Python中實現(xiàn)AES算法需要借助的第三方庫Crypto,其在各個操作系統(tǒng)上的安裝方法有些許復(fù)雜,所以對于簡單的使用有點殺雞用牛刀的意思。這篇文章主要介紹了利用Python內(nèi)置方法實現(xiàn)字符串的秘鑰加解密,需要的朋友可以參考下2019-12-12
Python3將jpg轉(zhuǎn)為pdf文件的方法示例
這篇文章主要介紹了Python3將jpg轉(zhuǎn)為pdf文件的方法,結(jié)合完整實例形式分析了Python3針對jpg轉(zhuǎn)pdf格式的文件讀寫、編碼裝換等相關(guān)操作技巧,需要的朋友可以參考下2019-12-12
python 實現(xiàn)二維字典的鍵值合并等函數(shù)
今天小編就為大家分享一篇python 實現(xiàn)二維字典的鍵值合并等函數(shù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Keras 實現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層
這篇文章主要介紹了Keras 實現(xiàn)加載預(yù)訓(xùn)練模型并凍結(jié)網(wǎng)絡(luò)的層,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
解析Pytorch中的torch.gather()函數(shù)
本文給大家介紹了Pytorch中的torch.gather()函數(shù),通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-11-11
利用Python實現(xiàn)簡單的Excel統(tǒng)計函數(shù)
這篇文章主要介紹了利用Python實現(xiàn)簡單的Excel統(tǒng)計函數(shù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07

