原文連結:30 Days of Python :man::computer: - Day 10 - OOP Missing Pieces
Super()super 是Python中的一個保留字(在Python2.2中被引入),在繼承中使用。當一個子類繼承自一個父類,並且需要呼叫這個父類上的方法時,就需要用到 super 。這樣聽起來可能讓人有些疑惑,來看一個例子:
不使用 super
在這個例子中,父類的 __init__ 構造方法用類名呼叫, self 物件作為第一個引數被傳入。
使用 super (注意它不需要傳入引數 self )
像上面程式碼中的構造方法一樣,父類的任何方法在子類中都能夠使用 super() 呼叫。
在JavaScript中,語法更簡單一點, super 的呼叫方式類似 super(parameter) 這樣。但是我喜歡Python的語法。使用 super 呼叫 __init__ 方法更加清楚。
內省Python能夠計算在執行時計算物件的型別(在Python中一切皆物件)。這意味著編譯器在執行時能夠動態的理解物件的屬性和方法。這叫做 內省 。
Python提供了一個內建函式 dir 來對一個物件進行內省。
魔術方法在Python中,透過定義一些 魔術方法 類會變得更加強大。這些方法名的前面和後面都有兩個 __ ,在Python中被預先定義,有著特殊的用途。例如,我們可以訪問內建函式,因為它被定義為一個特殊的魔術方法 __len__
我修改了 Sentence 類,這樣我們就可以使用內建方法 len ,預設情況下, len 不能用於實現自定義邏輯。魔術方法看上去非常的方便。
多繼承一個類從多個類中繼承屬性和方法是有可能的。多繼承是一個強大的概念,但也是危險的。在JavaScript中,多繼承是不被支援的。
當父類有需要初始化的建構函式方法時,它可能會變得有點複雜。在子類中,它所繼承所有類的建構函式方法都需要初始化。
方法解析順序方法解析順序或簡稱 mro ,是Python中屬性和方法繼承的順序。
當從多個類繼承時,屬性和方法由特定層次結構中的子類繼承。Python中實現此功能的底層演算法使用深度優先搜尋演算法。
為了瞭解繼承順序,Python提供了一個方法 mro ,可以在物件上呼叫該方法來檢視繼承的層次結構。
多繼承可能很難理解,所以這種模式在實踐中並不常用。
這就是今天所有的內容了。最後講完了Python中的面向物件程式設計概念。我們的目標是在這個挑戰結束後,開始構建真正的Python專案時使用這些原則。
我希望我能夠涵蓋Python中所有關鍵的面向物件程式設計概念,並且解釋的足夠通俗易懂。