2016-11-22 59 views
1

在不同類別的幾個__init__我不得不多次使用該構造解釋輸入的字符串和類成員的名字

try: 
    self.member_name = kwargs['member_name'] 
except: 
    self.member_name = default_value 

或摩西Koledoye的建議

self.member_name = kwargs.get('member_name', default_value) 

我想有一種方法可以輸入字符串'member_name'default_value,並且相應的初始化會被生成。例如,如果一個輸入'pi_approx'3.14生成的代碼是

self.pi_approx = kwargs.get('pi_approx', 3.14) 

這樣我可以通過沿着所有所需的成員和它們的默認值的列表的環取代這些初始化的長序列。

This technique emulate a switch statement是不一樣的東西,但有一種類似的味道。

我不知道如何處理我想要做的事情。


假設initializer(m_name, default_val)是得到由

self.m_name = kwargs.get('m_name', default_val) 

話,我會用它取代由具有列出member_names = [m_name1, m_name2, m_name3]default_values = [def_val1, def_val2, def_val3],並呼籲

for m_name, d_val in zip(member_names, default_values): 
    initializer(m_name, d_val) 

這將更換長長的名單建設的嘗試,也使代碼更具可讀性。

回答

2

如果您try/except是爲了處理KeyError,那麼你可以使用kwargs字典,它允許你提供一個默認值的get方法:

self.member_name = kwargs.get('member_name', default) 

可以擴展到您的屬性名稱的列表使用setattr

for m_name, d_val in zip(member_names, default_values): 
    setattr(self, m_name, kwargs.get(m_name, d_val))