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 super繼承詳解Python繼承
- java繼承-super的用法Java繼承
- python 基礎之繼承、重寫、多繼承Python繼承
- Python 繼承 和 多型Python繼承多型
- python 多繼承詳解Python繼承
- 多繼承 與 多重繼承繼承
- Python中的繼承和多型Python繼承多型
- 多繼承繼承
- 深入Spring Boot:ClassLoader的繼承關係和影響Spring Boot繼承
- python 詳解類class的繼承、__init__初始化、super方法Python繼承
- 公有繼承、私有繼承和保護繼承之間的對比繼承
- java繼承-重寫-super例項補充Java繼承
- Hibernate繼承對映多型的詳解繼承多型
- 淺析 Python 的類、繼承和多型Python繼承多型
- python繼承Python繼承
- python 繼承Python繼承
- 繼承與多型繼承多型
- 繼承和多型繼承多型
- 多型和繼承多型繼承
- Python類的繼承Python繼承
- day23:單繼承&多繼承&菱形繼承&__init__魔術方法繼承
- JavaScript 的繼承與多型JavaScript繼承多型
- OOP的多型和繼承OOP多型繼承
- Javascript的繼承與多型JavaScript繼承多型
- 什麼是繼承?Python繼承的特徵有哪些?繼承Python特徵
- python 類繼承,對類屬性的改變Python繼承
- 【Python】python類的繼承Python繼承
- abstract關鍵字 super 關鍵字 類與繼承繼承
- Python 簡明教程 --- 21,Python 繼承與多型Python繼承多型
- 詳細介紹Python類的繼承與多型Python繼承多型
- python之繼承Python繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- java繼承與多型Java繼承多型
- 繼承+多型+抽象類繼承多型抽象
- Castle 多繼承選擇AST繼承
- Scala多繼承以及AOP繼承
- JS中的多種繼承方式JS繼承
- C中的繼承和多型繼承多型