python中super().__init__()作用詳解
super().__ init__ ()有什么用?
super().__init__() 、 super(B,self).__init__()
python里的super().__init__()有什么作用?很多同學沒有弄清楚。
super()用來調用父類(基類)的方法,__init__()是類的構造方法,
super().__init__() 就是調用父類的init方法, 同樣可以使用super()去調用父類的其他方法。
1、分別理解super()和 __ init __()
1.1、super()

需要注意的是python2、3的super寫法稍有不同。
1.2、__ init __()
__init__() 是python中的構造函數(shù),在創(chuàng)建對象的時"自動調用"。

定義類時可以不寫init方法,系統(tǒng)會默認創(chuàng)建,
你也可以寫一個,讓你的類在創(chuàng)建時完成一些“動作”。
1.3、super(). __ init __()
如果子類B和父類A,都寫了init方法,
那么A的init方法就會被B覆蓋。想調用A的init方法需要用super去調用。

當然,在B內部,除了用super調用父類的方法,也可以用父類名調用,例:
class B(A):
def __init__(self):
A.__init__(self)
print("B init")1.3.1、關于“覆蓋”的疑問
有人可能會誤解“覆蓋”的意思,認為“覆蓋”了就是沒有,為什么還能通過super調用?
覆蓋了并不是沒有了,A的方法終都還在,但需要在B內部用super調用。
例:
A里寫了一個方法hi(), B繼承自A, B里也寫了一個方法hi()。
B的對象在外部調用hi(), 就只能調用B里面寫的這個hi()。
想通過B調用A的hi(),只能在B內部用super().hi()調用。
class A:
def hi(self):
print("A hi")
class B(A):
def hello(self):
print("B hello")
b = B()
b.hi() # B里沒有寫hi(),這里調用的是繼承自A的hi()
------------------------------------------------------------------
class A:
def hi(self):
print("A hi")
class B(A):
def hi(self):
print("B hi")
b = B()
b.hi() # 這里調用的就是B自己的hi()
------------------------------------------------------------------
class A:
def hi(self):
print("A hi")
class B(A):
def hi(self):
super().hi() # 通過super調用父類A的hi()
print("B hi")
b = B()
b.hi() # 這里調用的就是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) # 3Python2.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) # 33、關于繼承順序
最底層:先寫一個父類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)
下面是三種不同的繼承、調用,對比他們的區(qū)別,搞清楚super().__init__()的用途。
4.1、實例

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

4.3、完整代碼

到此這篇關于python中super().__init__()作用詳解的文章就介紹到這了,更多相關python中super().__init__()內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python進行PostgreSQL數(shù)據(jù)庫連接的詳細使用指南
在Python中連接PostgreSQL數(shù)據(jù)庫,最常用的庫是psycopg2,本文為大家詳細介紹了Python使用psycopg2庫操作PostgreSQL的詳細步驟,需要的可以了解下2025-05-05
python+jinja2實現(xiàn)接口數(shù)據(jù)批量生成工具
這篇文章主要介紹了python+jinja2實現(xiàn)接口數(shù)據(jù)批量生成工具的操作方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08

