文章目錄
- Python 繼承示例:有與無 `super().__init__()` 的區別
- 父類(Parent)
- 子類(Child)不調用 `super().__init__()`
- 子類(Child)調用 `super().__init__()`
Python 繼承示例:有與無 super().__init__()
的區別
好的,我將通過一個簡單的例子來展示 super().__init__()
的作用。我們將創建兩個類:Parent
作為父類,Child
作為繼承自 Parent
的子類。每個類都有一個屬性和一個方法,并且我們將看看在子類中是否調用 super().__init__()
的區別。
父類(Parent)
class Parent:def __init__(self):self.parent_attr = "I am from Parent"def parent_method(self):print("This is a method from Parent")
子類(Child)不調用 super().__init__()
class Child(Parent):def __init__(self):# super().__init__() 這行被注釋掉了self.child_attr = "I am from Child"def child_method(self):print("This is a method from Child")# 創建子類實例并嘗試訪問父類的屬性和方法
child_instance = Child()
print(child_instance.child_attr) # 輸出: I am from Child
child_instance.child_method() # 輸出: This is a method from Childtry:print(child_instance.parent_attr) # 將會引發 AttributeError
except AttributeError as e:print(f"Error: {e}") # 輸出: Error: 'Child' object has no attribute 'parent_attr'try:child_instance.parent_method() # 將會引發 AttributeError
except AttributeError as e:print(f"Error: {e}") # 輸出: Error: 'Child' object has no attribute 'parent_method'
在這個例子中,因為沒有調用 super().__init__()
,所以 child_instance
實例不會初始化來自 Parent
類的 parent_attr
屬性,也不會定義 parent_method
方法。因此,當嘗試訪問這些成員時,會拋出 AttributeError
異常。
子類(Child)調用 super().__init__()
class Child(Parent):def __init__(self):super().__init__() # 調用了父類的構造函數self.child_attr = "I am from Child"def child_method(self):print("This is a method from Child")# 創建子類實例并嘗試訪問父類的屬性和方法
child_instance = Child()
print(child_instance.child_attr) # 輸出: I am from Child
child_instance.child_method() # 輸出: This is a method from Child
print(child_instance.parent_attr) # 輸出: I am from Parent
child_instance.parent_method() # 輸出: This is a method from Parent
在這個版本中,Child
類正確地調用了 Parent
類的構造函數,所以 child_instance
實例不僅有它自己的 child_attr
屬性和 child_method
方法,而且還有從 Parent
類繼承來的 parent_attr
屬性和 parent_method
方法。這樣,你可以成功地訪問所有這些成員,而不會遇到任何錯誤。
這個例子展示了為什么在子類中調用 super().__init__()
是很重要的,因為它確保了父類的所有初始化邏輯都能被執行,從而保證對象能夠正確地工作。