Python 關於super在多繼承中的解析


一、單繼承情況:

 解析:

創建B類的實例化對象時,執行初始化函數:

打印輸出Enter B,當遇到super()調用父類初始化函數(此時是調用B類的父類A的__init__函數),輸出Enter A、Leave B,調用完成父類初始化函數后,繼續執行下一句代碼,輸出Leave B

  

二、多繼承情況:

 

class A:
def __init__(self):
#print(super())
print("Enter A")
print("Leave A")

class B(A):
def __init__(self):
print("Enter B")
#print(super())
super().__init__()
print("Leave B")

# single = B()
# print(B.mro())
class C(A):
def __init__(self):
print("Enter C")
print(super())
super().__init__()
print("Leave C")


class D(B,C):
def __init__(self):
print("Enter D")
print(super())
super().__init__()
print("Leave D")

D()
print(D.mro())

輸出結果:

Enter D
<super: <class 'D'>, <D object>>
Enter B
Enter C
Enter A
Leave A
Leave C
Leave B
Leave D
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

解析:

1、執行順序:D->B->C->A->object

2、根據執行順序,執行D類,輸出Enter D,

第一次執行super()時,調用D的父類B的__init__(),輸出Enter B,

第二次執行super()時,則調用D的父類C的__init__(),輸出Enter C,

第三次執行super()時,則調用A類的__init__(),輸出Enter A和Leave A

C類執行完super().__init__()后,繼續執行下一句,輸出Leave C

B類執行完super().__init__()后,繼續執行下一句,輸出Leave B

D類執行完super().__init__()后,繼續執行下一句,輸出Leave D

總結:

super()當出現多繼承時,調用的順序是根據類實例化時的執行順序決定。

另,python3的繼承尋址方式是廣度優先,先從左到右,最后到基類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM