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中的構造函數,在創建對象的時"自動調用"。
定義類時可以不寫init方法,系統會默認創建, 你也可以寫一個,讓你的類在創建時完成一些“動作”。
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中的區別
Python3.x 和 Python2.x 的一個區別: 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、關於繼承順序
最底層:先寫一個父類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的繼承順序
我們發現G繼承自E, F是並列的,初始化的時候不會先把E初始化完畢才初始化F。
4、從多個實例中對比super(python3)
下面是三種不同的繼承、調用,對比他們的區別,搞清楚super().__init__()的用途。
4.1、實例
子類名稱 | 繼承內容 |
---|---|
Puple | 繼承所有 |
Puple_Init | 繼承,但覆蓋瞭init方法 |
Puple_Super | 繼承,但覆蓋瞭init方法,並在init裡面添加瞭super().__init__() |
4.2、運行結果與對比
4.3、完整代碼
到此這篇關於python中super().__init__()的用法的文章就介紹到這瞭,更多相關super().__init__()的用法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python中super().__init__()測試以及理解
- Python類的定義和使用詳情
- python中super()函數的理解與基本使用
- Python編程super應用場景及示例解析
- Python中super()的理解以及應用場景實例