2013-07-09 20 views
0

這是一個關於乾淨,pythonic方式來處理一些不同的實例方法的問題。不同的方法。希望班級能夠對待他們都是一樣的

我有一個班,根據某些輸入操作有點不同。這些差異似乎不足以證明生產全新的課程是合理的。我必須將這個類與幾個數據「提供者」中的一個接口。我想我是聰明的,當我介紹一本字典:

self.interface_tools={'TYPE_A':{ ... various ..., 'data_supplier':self.current_data}, 
         'TYPE_B':{ ... various ..., 'data_supplier':self.predicted_data} } 

然後,作爲類初始化的一部分,我有一個輸入「SOURCE_NAME」而我呢......

# ... various .... 
self.data_supplier = self.interface_tools[source_name]['data_supplier'] 

self.current_dataself.predicted_data需要相同的輸入參數,所以當需要調用該方法時,我不必區分它們。我可以叫

new_data = self.data_supplier(param1) 

但現在我需要一個新的數據源接口 - 稱之爲「TYPE_C」 - 它需要更多的輸入參數。有辦法做到這一點,但我想不到的是很乾淨。舉例來說,我只需要添加新的參數老data_suppliers而從不使用它們,所以再調用會是什麼樣子

new_data = self.data_supplier(param1,param2,param3) 

但我不喜歡這樣。我可以添加一個IF塊

if self.data_source != 'TYPE_C': 
    new_data = self.data_supplie(param1) 
else: 
    new_data = self.data_c_supplier(param1,param2,param3) 

,但如果避免這樣的街區正是我試圖在與該字典,我想出了第一個地方做。

所以結果是:我有一些「data_supplier」例程。現在我的項目已經擴大,他們有不同的輸入列表。但我希望我的班級能夠儘可能地對待他們。有任何想法嗎?謝謝。

+0

阻止參數,無論是作爲一個列表或一個類,並使每個數據供應商只需要一個參數,這是參數的集合。 – katrielalex

回答

1

聽起來像你的功能可以使用variable length argument lists

也就是說,你也可以創建子類。他們相當便宜,並會解決您的問題在這裏。這非常符合他們的設計。

+0

如果可以的話,我會投票兩次,因爲這兩個點都非常有效。 – martineau

1

您可以讓所有的data_suppliers接受一個參數,並使其成爲字典或列表,甚至是NamedTuple。

+0

如果你打算這樣做,你可能只需要使用可變長度參數列表和/或關鍵字參數擴展。這是他們在那裏。 – Amber

相關問題