2012-11-04 16 views
0

我在考慮我班api的部分內容,並且提出了以下幾點: 我應該使用同等屬性的元組/列表還是應該使用多個屬性假設我有一個Controller班,裏面有幾個溫度計。屬性命名,元組與多個名稱

class Controller(object): 
    def __init__(self): 
     self.temperature1 = Thermometer() 
     self.temperature3 = Thermometer() 
     self.temperature2 = Thermometer() 
     self.temperature4 = Thermometer() 

class Controller(object): 
    def __init__(self): 
     self.temperature = tuple(Thermometer() for _ in range(4)) 

有沒有當我應該使用哪種風格的最佳做法?

(假設溫度計的數量不會改變,否則選擇具有列表中的第二風格,將是顯而易見的。)

+1

是否有可能以任何方式區分不同的溫度?溫度1與溫度3有什麼不同?我會嘗試找到這種區別,使用第一種情況並命名其後的溫度,例如temperatureInner,temperatureOuter等。 –

回答

4

元組或列表,100%。 variable1variable2等...是一個非常常見的反模式。

想想你以後如何編碼 - 很可能你會想對這些項目做類似的事情。在一個數據結構中,你可以循環它們來執行操作,使用編號的變量名稱,你必須手動完成。不僅如此,它更容易添加更多值,它使您的代碼更通用,因此更易於重用,並且意味着您可以輕鬆地在執行過程中添加新值。

爲什麼假設數字不會被改變?通常情況下,這樣的假設最終是錯誤的。無論如何,您已經可以看到第二個例子說明了不要重複自己對於清晰高效的代碼至關重要。

即使你有更多的相關名字,例如:cpu_temperaturehdd_temperature,我會說如果你看到自己對它們執行相同的操作,你需要一個數據結構,而不是很多變量。在這種情況下,一本字典:

temperatures = { 
    "cpu": ..., 
    "hdd": ..., 
    ... 
} 

最主要的是,通過存儲在數據結構中的數據,你給軟件有關您提供的分組信息。如果你只給他們一些變量名,你只能告訴程序員 - 如果他們被編號,那麼你甚至不會真的告訴程序員他們是什麼。

+3

如果位置訪問感興趣,您可能還想看看[namedtuple](http://docs.python.org/2/library/collections。html#collections.namedtuple),它們是_「具有可通過屬性查找訪問的字段的類元組對象,以及可索引和可​​迭代」_。 –

+0

@PedroRomano非常好的一點。如果你在你的程序中使用這些元組,「namedtuple」是一個完整的類的完美替代品。 –

0

另一種方法是將它們存儲爲字典:

{1: temp1, 2: temp2} 

在決定如何存儲數據的中繼,最重要的數據的意思,如果這些項目基本上是在一個稍微相同的信息不同的上下文,那麼他們應該被分組(根據數據類型)來中繼它們 - 即它們應該被存儲爲元組或字典。

注意:如果您使用元組,然後再插入更多數據一開始就有一個temp0,那麼可能會出現向後兼容性問題,因爲您已經抓住了各個變量。 (隨着字典temp[1]將始終返回temp1。)

+0

爲什麼會有*向後兼容性問題*與元組? –

+0

@Lattyware如果您插入'temp0'使其成爲'(temp0,temp1,temp2,...)'而不是'(temp1,tempt2,...)(訪問第一個元素將不再獲取溫度1)。 –

+0

噢,所以你說的每個編號溫度需要完全不同的處理,並且通過索引訪問?我推測如果數據存儲在列表/元組中,它將被迭代(這顯然不會受到添加新的項目),而如果需要根據我的答案進行單獨的處理,則會使用字典。 –