一個經典且違反 Liskov 置換原則(LSP)的案例是「圓形-橢圓問題」,有時也稱作「正方形-長方形問題」。
直覺上,你可能會想先定義一個 Rectangle 類別,帶有 h 與 w 屬性(高度與寬度),然後再定義一個繼承自 Rectangle 的 Square 類別。畢竟,正方形「是」長方形的一種!
Rectangle
h
w
Square
可惜,這樣的直覺在物件導向設計中並不適用。
本練習屬於課程
試著完成這個範例程式碼,體驗一下這個練習。
# Define a Rectangle class ____ # Define a Square class ____
在本章中,你會認識什麼是物件導向程式設計(OOP)、它與程序式程式設計的差異,以及可以如何應用。接著你會自行定義類別,並學習如何建立方法、屬性與建構式。
繼承與多型是 OOP 的核心概念,可帶來高效且一致的程式碼重用。學習如何從類別繼承、自訂與改寫方法,並複習類別層級資料與實例層級資料之間的差異。
在本章中,你會學到如何讓儲存相同資料的物件被視為相等,如何定義與自訂物件的字串表示法,甚至如何建立新的錯誤型別。透過互動式練習,你將進一步自訂類別,讓它們更像標準的 Python 資料型態運作。
要如何設計可供繼承的類別?Python 是否有私有屬性?能否控制屬性的存取?在學習類別設計的最佳實務時,你會找到這些問題(以及更多)的答案。
當前練習