網站首頁 編程語言 正文
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中的構造函數,在創建對象的時"自動調用"。
定義類時可以不寫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、完整代碼
原文鏈接:https://blog.csdn.net/a__int__/article/details/104600972
相關推薦
- 2022-05-31 OpenCV角點檢測的實現示例_python
- 2022-05-11 Excel表中數據轉為sql
- 2022-05-27 C++?超詳細深入分析單例模式_C 語言
- 2022-11-18 flutter?showModalBottomSheet常用屬性及說明_Android
- 2022-06-15 go語言context包功能及操作使用詳解_Golang
- 2022-06-28 C#操作Byte數組和十六進制進行互轉_C#教程
- 2022-05-04 Python?GUI編程之tkinter?關于?ttkbootstrap?的使用詳解_python
- 2023-07-07 更新node后項目報錯
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支