python:super()對多繼承的影響
先對比如下兩段程式碼的區別:
1. 使用 父類.父類方法(self)的方式繼承
class A:
def __init__(self):
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
A.__init__(self)
print("Leave B")
class C(A):
def __init__(self):
print("Enter C")
A.__init__(self)
print("Leave C")
class D(A):
def __init__(self):
print("Enter D")
A.__init__(self)
print("Leave D")
class E(B, C, D):
def __init__(self):
print("Enter E")
B.__init__(self)
C.__init__(self)
D.__init__(self)
print("Leave E")
E()
print(E.__mro__)
# 結果如下:
Enter E
Enter B
Enter A
Leave A
Leave B
Enter C
Enter A
Leave A
Leave C
Enter D
Enter A
Leave A
Leave D
Leave E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)
2. 使用 super(本類,self).父類方法() 的方式繼承
class A:
def __init__(self):
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
super(B, self).__init__()
print("Leave B")
class C(A):
def __init__(self):
print("Enter C")
super(C, self).__init__()
print("Leave C")
class D(A):
def __init__(self):
print("Enter D")
super(D, self).__init__()
print("Leave D")
class E(B, C, D):
def __init__(self):
print("Enter E")
super(E, self).__init__()
print("Leave E")
E()
print(E.__mro__)
# 結果為:
Enter E
Enter B
Enter C
Enter D
Enter A
Leave A
Leave D
Leave C
Leave B
Leave E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)
在python3中以上兩種繼承方式的方法執行順序相同,根據E.__mro__返回值,繼承順序如下圖:
但可以看到例項化E後的結果不同,前者按深度優先原則,後者按廣度優先原則,所以super保證了公共父類只執行一次。
相關文章
- python 基礎之繼承、重寫、多繼承Python繼承
- Python 繼承 和 多型Python繼承多型
- Python中的繼承和多型Python繼承多型
- 深入Spring Boot:ClassLoader的繼承關係和影響Spring Boot繼承
- 多繼承 與 多重繼承繼承
- python 詳解類class的繼承、__init__初始化、super方法Python繼承
- 多繼承繼承
- 【Python】python類的繼承Python繼承
- python繼承Python繼承
- python 繼承Python繼承
- Python類的繼承Python繼承
- Python 簡明教程 --- 21,Python 繼承與多型Python繼承多型
- 什麼是繼承?Python繼承的特徵有哪些?繼承Python特徵
- 詳細介紹Python類的繼承與多型Python繼承多型
- python之繼承Python繼承
- 繼承與多型繼承多型
- 多型和繼承多型繼承
- day23:單繼承&多繼承&菱形繼承&__init__魔術方法繼承
- JavaScript 的繼承與多型JavaScript繼承多型
- Javascript的繼承與多型JavaScript繼承多型
- OOP的多型和繼承OOP多型繼承
- abstract關鍵字 super 關鍵字 類與繼承繼承
- python多執行緒之從Thread類繼承Python執行緒thread繼承
- 『無為則無心』Python物件導向 — 55、多層繼承和繼承中的私有成員Python物件繼承
- java繼承與多型Java繼承多型
- JS中的多種繼承方式JS繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- Python的多重繼承如何使用?python教程Python繼承
- python極簡教程07:封裝、多型和繼承Python封裝多型繼承
- 如何TypeScript中相對優雅地實現類的多繼承TypeScript繼承
- PHP模擬多繼承的方式:traitsPHP繼承AI
- Java中的類繼承與多型Java繼承多型
- 【Dataguard】Oracle多租戶環境對Dataguard的影響Oracle
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- 封裝、繼承和多型封裝繼承多型
- TypeScript(5)類、繼承、多型TypeScript繼承多型
- 如何理解Python中的繼承?python入門Python繼承
- Python的多繼承問題-MRO和C3演算法Python繼承演算法