天天看點

《Python面向對象程式設計指南》——1.6 在每個子類中實作__init()__方法

本節書摘來自異步社群《python面向對象程式設計指南》一書中的第1章,第1.6節,作者[美]steven f. lott, 張心韬 蘭亮 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

正如介紹工廠函數那樣,這裡我們也先看一些card類的設計執行個體。我們可以考慮重構rank數值轉換的代碼,并把這個功能加在card類上。這樣就可以把初始化的工作分發到每個子類來完成。

這通常需要在基類中完成一些公共的初始化邏輯,子類中完成各自特殊的初始化邏輯。我們需要遵守不要重複自己(don't repeat yourself,dry)的原則來防止子類中的代碼重複。

以下代碼示範了如何把初始化職責分發到各自的子類中。

上例代碼是多态的實作,由于缺乏公共初始化函數,導緻了一些不受歡迎的重複代碼。以上代碼的主要重複部分是對suit的指派。這部分代碼放在基類中顯然比較合适。我們可以在子類中顯式調用基類的__init()__方法。

以下代碼示範了如何把__init()__方法提到基類card中實作的過程,然後在子類中可以重用基類的實作。

我們在子類和基類中都提供了__init()__方法的實作,這樣會在一定程度上簡化工廠函數的邏輯,如下面代碼段所示。

僅僅是簡化工廠函數不應該是我們重構焦點的全部。我們還應該看到這次的重構導緻__init()__方法變得複雜了,做這樣的權衡是正常的。

《Python面向對象程式設計指南》——1.6 在每個子類中實作__init()__方法