2010-11-22 20 views
0

我是OOP的新手,因此,我正在尋找關於對以下問題出現的問題進行編碼的良好實踐的建議。關於是否在__init __()方法中包含某些內容的問題

我正在定義一個Seller(a, b, c, d)類。這個類有很多屬性,其中兩個是mostRecentProfitprofitHistory。然而,當這個類被初始化時,這兩個值是不知道的。在實現這些程序之前,必須執行程序中的其他一些步驟。我的問題是:

在銷售類的__init__(a, b, c, d),我應該寫

self.mostRecentProfit = None 
self.profitHistory = [] 

,或者我不應該在所有的__init__方法定義這些。前者對我來說很吸引人的原因是,通過查看__init__()方法,我可以知道班級的所有屬性。但是,這可能不是一個很好的理由。任何建議,將不勝感激。

謝謝。

+0

請考慮遵循[PEP 8](http://www.python.org/dev/peps/pep-0008/)中提出的標準Python命名指南 - self.most_recent_profit和self.profit_history。 – 2010-11-22 13:37:20

+0

@克里斯......這和處方壓痕一樣糟......哦,等等。 :) – sje397 2010-11-22 13:59:47

回答

3

我會定義它們。根據我的經驗,當處理實例的代碼頻繁引用這些屬性時,並不這樣做,這意味着在循環之前最終會輸入if object.profitHistory:等。如果列表中存在空列表,則可以跳過這些條件。正如你所說,它使它更清晰易讀。

+0

+1定義它們,如果它們對班級起作用是必要的,則不要這樣做。 – Falmarri 2010-11-22 18:59:12

4

定義__init__()中的屬性可以使代碼更好地適用於沒有看到代碼的人必須開始使用代碼的情況。當一個類開始訪問一個起初似乎不存在的屬性時,可能會引起混淆。

此外,由於您的默認值之一是一個列表而不是None,因此對它進行初始化意味着您始終可以將該屬性視爲列表,而不必擔心其狀態。

+0

OP的代碼*會將列表初始化爲空白列表。 – martineau 2010-11-22 15:11:33

+0

如果他應該定義它們,OP的問題是**。如果他沒有定義屬性,那麼他不會將它初始化爲任何東西。我對列表的評論是爲了進一步支持爲什麼定義它們是有意義的(因爲它在第一次使用時需要初始化)。 – unholysampler 2010-11-22 15:33:30

1

我會在__init()方法中定義它們,因爲這不僅會記錄它們通常都是什麼,而且如果將它們的默認值全部定義爲有效,那麼允許其餘大部分代碼輕鬆地處理實例即使這些屬性永遠不會更新。

因此,在您的示例中,這意味着初始化self.mostRecentProfit0或者可能是0.0而不是None。這樣做可以在不參考每個引用之前檢查它是否存在,並且每個引用都包含在try/except塊中以處理它們從未明確設置爲其他值的情況。

相關問題