在軟件設計里,代碼的復用和代碼穩定性,一直是軟件開發的重要目標之一,因為只有這樣才能積累各種基礎組件,以及維護以前做過的工作。從復用的特性來說,就是利用以前做過的工作,比如就像硬件里的IC一樣,不需要知道它是怎么樣實現的,只要使用它就行了。因而軟件也需要有這種IC,在代碼層次里的IC,以前看來只是用函數的方式復用,或者只是數據結構的復用。當邁進面向對象編程時代時,自然而然地想到就使用類來復用了,這樣數據結構和函數都同時能復用上,比函數的復用更省心了一步,就是數據結構和算法都不需要關心了,只關心類提供了幾個接口即可。比如想要MD5進行簽名,只需要使用這個類設置計算的數據和長度,就可以直接返回相應MD5簽名了。而不必關心內部是做什么運算,使用什么數據結構來保存中間變量等。在類的復用里,主要有兩種方式,一種是直接使用類,不對類進行任何的改變,比如類的組合方式;另外一種是對類進行改變,繼承就是其主要方式。繼承的方式要比組合的方式更方便,因為繼承可以直接使用父類的數據結構,不需考慮父類的生命周期,而組合的方式是一定要考慮的。繼承的方式可以不改變以前接口,而使用最新的優化的算法,而組合的方式是一定要改變接口。繼承的方式處理不同版本軟件兼容性也要方便,比如開發三個版本的軟件,每一個版本功能測試完成之后,再開發下一個版本,在開發下一個版本時,又不想改動原來的代碼,但又要利用和修改其一些計算方法,使用繼承是最好的。這樣可以在一個類里實現自動識別不同的版本功能進行處理,只需要創建時創建新的類對象就可以。
Python里也設計有類繼承,它的類繼承方式怎么樣呢?大體如下:
從上面可以看到,Super類是基類(又稱為超類),Sub是繼承Super類。Sub類可以繼承多個基類,只要在括號并列多個就行,如Sub(Super1, Super2, Super3)。在派生類里要明確地調用基類的構造函數,才可以運行基類構造函數,如Super.__init__(self, x)。這一點不像C++的特性,在C++里是自動運行基類的構造函數,再運行派生類的構造函數。Python里按需要定制,想什么時候運行就在什么地方調用。