2013-07-25 21 views
1

背景:來自Perl世界,我目前正在學習Python中的新作 作業。除了完成這項工作外,我還試圖通過閱讀SO,Python 文檔和各種文章,讓更多的「真正的OOP」和「pythonic」思維融入我的大腦細胞流。Python中的BaseBean反模式

現在Anti-pattern頁的面向對象的設計部分,維基百科列出了此 BaseBean,其上its own page被描述爲:

在面向對象的編程中,BaseBean是一個實用目的從中 混凝土實體派生(通過子類化)。正確的設計建議 繼承的功能應通過委託提供。 BaseBean是反模式的示例(其中 名稱的「Bean」部分來自通用實體 對象或JavaBean的標準Java命名約定)。

也許這是因爲我沒有使用Java的經驗,也許是因爲其他原因, 但我在解決這個問題時遇到了麻煩。不過,我是 ,感覺幾行代碼在這裏會勝過千言萬語。

任何人都可以幫助澄清這對我嗎?最好在Python中使用一個簡單的例子?

回答

0

在此基礎上引用維基百科文章:

使用繼承將導致派生類依靠 基類的內部這可能是出於開發商的控制。雖然 實用程序類通常穩定並且在實現中非常相似,但未來的一些無害更改可能會破壞派生類(因爲關係沒有很好定義)。在 此外,它混淆派生類的商業含義。例如,對於 示例,訂單不是一個向量,但訂單可能包含訂單項的向量 。

它似乎指的是這樣的事情:

class Order(dict): 
    def __repr__(self): 
     return """ 
Customer: {customer} 
Address: {address} 
     """.format(**self) 

o = Order(customer = "Joe Customer", address = "123 Market St") 
+0

我很抱歉,但我不覺得你的例子很清楚 - 它是如何說明了反模式?而維基百科的文章首先不清楚(例如,它們是什麼意思的「實用類」?;跨什麼實現?;什麼向量?)。 –

+0

維基百科示例中提到的內容是使用更一般的類(列表或向量)* AS *您的訂單類。考慮訂單類。理想情況下,它應該包含訂單元數據和訂單項列表。因此,維基百科中引用的示例使用您的「實用程序」(矢量/列表)類* AS *您的訂單類。這不是一個「isa」關係 - 它是一個「hasa」關係。訂單包含訂單項列表......它們不是訂單項自身的列表。 –