2012-03-12 35 views
6

我有一個程序,我正在用Python編寫,它執行以下操作:Python中詳細的__init__方法很糟糕嗎?

用戶輸入文件夾的名稱。在該文件夾中有一個8-15 .dat文件,其擴展名不同。

該程序打開這些dat文件,將它們輸入到SQL數據庫中,然後允許用戶選擇對數據庫所做的不同更改。然後將數據庫導出回.dat文件。大約有5-10種不同的操作可以執行。

我在設計時計劃的方式是爲每組文件創建一個標準類。用戶將輸入文件夾的名稱以及具有特定屬性(文件名,文件字典,文件版本(有不同版本)等的對象)將被創建。確定這些屬性需要打開這些文件中的幾個,讀取文件名等。

該操作是否應該在__init__方法中執行?或者應該採用在__init__方法中調用的不同實例方法執行此操作?或者應該將這些方法放在其他位置,並且只有在程序中的其他位置需要該屬性時纔會調用這些方法?

我已經用Java編寫了這個程序。我有一個構造函數調用類中的其他方法來設置對象的屬性。但我想知道Python中的標準做法是什麼。

回答

1

看起來你正在描述的動作初始化,所以它可以很好地把它們放入__init__。另一方面,這些行爲似乎相當昂貴,並且可能在程序的其他部分很有用,所以您可能希望將它們封裝在一個單獨的函數中。

1

當實例化對象時調用__init__方法。

來自C++背景我相信它不是很好做​​的實際工作,而不是在構造函數初始化。

1

長長的方法沒有問題,但我會避免它,只是因爲它更難以測試。我的方法是創建從__init__調用的更小的方法。這樣你可以分別測試它們和初始化。

他們是否應該在需要時被調用或在前面運行真的取決於你需要他們做什麼。如果他們是昂貴的操作,並且通常不是全部需要,那麼最好只在需要時打電話給他們。另一方面,您可能希望先運行它們,以便在需要屬性時不會出現延遲。

它不清楚你的問題,你是否真的需要一個類。我對Java沒有經驗,但是我明白,它的一切都是一個類。在python中,只需要一個函數就可以完成這個任務,並且只需要在需要實例和其他優雅的東西時創建類。

+0

本質上,我有一組文件可以歸類爲「作業」。不同的功能對此作業執行不同的操作以產生程序的預期結果。這就是爲什麼我認爲最好把它當作一堂課。 – 2012-03-12 15:16:27

+0

看起來這是你的建議: __init __(self,foldername): self.filelist = getfilelist(...); self.fileversion = getfileversion(...); 等? 除了其中一種方法昂貴且僅在某些情況下必需的情況下? – 2012-03-12 15:16:54

+0

如果這就是你的代碼的做法,那麼也許你應該使用[懶惰屬性](http://stackoverflow.com/q/3012421/1235039)。有很多方法可以做到這一點,這取決於您的要求和偏好。 – aquavitae 2012-03-12 15:28:10

3

那麼,Python中良好的OOP實踐沒有什麼特別的。將一個大方法分解爲一堆小方法在Java和Python中都是好主意。除其他事項外小方法讓你來寫不同的構造了一個機會:

class GroupDescriptor(object): 
    def __init__(self, file_dictionary): 
     self.file_dict = file_dictionary 
     self.load_something(self.file_dict['file_with_some_info']) 

    @classmethod 
    def from_filelist(cls, list_of_files): 
     file_dict = cls.get_file_dict(list_of_files) 
     return cls(file_dict) 

    @classmethod 
    def from_dirpath(cls, directory_path): 
     files = self.list_dir(directory_path) 
     return cls.from_filelist(files) 

除此之外,我不知道它是如何在Java中,但在Python,你不必擔心例外構造,因爲它們是處理得很好。因此,處理像文件這樣的容易出錯的東西是完全正常的。

+0

+1迄今爲止最好的回答! ;-)我喜歡用「多態的」構造函數/初始化器完成移動來分解暗示,即使它稍微草率,因爲你沒有詳細說明它! – 2012-03-12 15:59:34

相關問題