2013-11-14 65 views
2

在我來說,我有這個類:基於什麼內部**kwargs什麼是處理變量的更多pythonic方法?

class CSVUploader():                                   
    def __init__(self, **kwargs):            
     self.acc = kwargs['acc']             
     self.prod = kwargs['prod']            
     self.url_id = kwargs['url_id']           
     self.dest = kwargs['dest']            
     self.header = kwargs['header']           
     self.metadata = kwargs.copy()           
     self.table_name = '_'.join([self.prod, self.url_id]) 

此類包含了大量的信息,並做了很多事情。稍後,我將需要向字典(** kwargs)添加更多參數,以傳遞給此類。事情是我真的不知道我是否需要添加2個或10個以上的參數。

現在我在執行此類中的邏輯時使用了self.<variable>。例如:

self.check_columns(self.table_name, self.header) 

我其他的想法是使用self.metadata['variable'],而不是self....。 最後,我最後的想法是創建一個單獨的類,將保存所有的self.header和所有這些。但在我的代碼,我會這樣稱呼它:

metadata = Metadata() 
metadata.header 

所以有很多方法可以做到這一點,什麼是最pythonic的方式。另外,我保持我的代碼在邏輯上是分離的,乾淨且容易讀取的。

+1

您應該考慮使用'__getattr__'。它可以讓你提供對屬性的訪問,同時只保留「self.metadata」中的所有內容。即您可以提供更友好的用戶界面,同時保持簡單而小巧的實現,而不需要很多屬性。稍後,您可以修改'__getattr__'的樸素實現來執行更多操作(例如,即時計算「派生」屬性等) – Bakuriu

回答

0

可以在kwargs添加所有的變量實例:

class CSVUploader():  
    def __init__(self, **kwargs): 
     self.__dict__.update(kwargs) 

或者,你可以使用一個名爲元組和改變CSVUploader的方法成就此採取行動的功能。

CSVUploader = collections.namedtuple('CSVUploader', list_of_variable_names) 
相關問題