2017-10-04 8 views
1

内部でインスタンス化された異なるクラスインスタンスを持つコンテナインスタンスから構成される構造を考えてください。辞書の形ですべてのパラメータを割り当てるにはどうしたらいいですか?OOプログラムの初期化中に多数のパラメータを処理する最も厄介な方法

次の2つのオプションが考えられます。どちらがより無色で、なぜですか?どんな一般的なアプローチが最も無色で、なぜですか?

オプション1a、私の現在のアプローチ。 - 同僚のアプローチ

class Container(): 
    def __init__(self,params): 

    self.InstanceA = self.ClassA(all written out..) 
    self.InstanceB = self.ClassB(all written out..) 
    ... 
    self.InstanceF = self.ClassF(all written out..) 

オプション2:**のparamsのない同じですが、より詳細な

# hundred parameters 
params = {'A_param_1':0,'B_param_1':0,...} 

class Container(): 
    def __init__(self,params): 

    self.InstanceA = self.ClassA(**params) 
    self.InstanceB = self.ClassB(**params) 
    ... 
    self.InstanceF = self.ClassF(**params) 

class ClassA(): 
    def __init__(self, 
        A_param_1=0, 
        ... 
        A_param_16=0.123, 
        **kwargs) 
    # set param values to self. 
    self._A_param_1 = A_param_1 

オプション1bは、各含まれているインスタンスは、kwargsからを持っています。各含まれている場合は、kwargsからなしに行います。

# hundred parameters 
params = {'A_param_1':0,'B_param_1':0,...} 

class Container(): 
    def __init__(self,params): 

    self.InstanceA = self.ClassA(params) 
    self.InstanceB = self.ClassB(params) 
    ... 
    self.InstanceF = self.ClassF(params) 

class ClassA(): 
    def __init__(self, 
        params 
       ) 
    # set param values to self. 
    self._A_param_1 = self.params['A_param_1'] 

賛否オプション1aは各コンストラクタは、文字通り、これらkwargsからの性質が明示的にすることkwargsからデフォルト高く評価しています。

短所オプション1a:デフォルト値が使用されているかどうか、または**パラメータによって指定されたものかどうかはわかりません。 ** paramsは、特定のインスタンスに関連するパラメータだけでなく、すべてのパラメータをスローします。

プロオプション2:各インスタンスは、特定のパラメータが指定されていない場合、キーエラーで明示的に必要なものを取得します。

短所オプション2:パラメータの一般的な値は、ドキュメントストリングまたはコメントで明示的に指定する必要があります。

オプション1bは、オプション1aとオプション2のフレーバーを少し組み合わせて、コンストラクター呼び出しで** paramsを明示的に解凍する必要があるという追加の難しさがあるようです。

私の質問を繰り返すには:一般的に、これに近づく最も有望な方法は何ですか?

PS:私は自分自身を理解し、自分自身を表現するのに正しい用語を使用することを願っています。そうでない場合は、私に知らせてください。

+0

可能な複製のhttps://stackoverflow.com/questions/1389180/python-automatically-initialize-instance-variables –

答えて

0

すべてのパラメータを各コンストラクタに渡すのは嫌いです。私も、おそらくこのようなクラス名とインスタンス名を算出することにより、コンテナの初期化を自動化します

# hundred parameters 
params = {'A': {'A_param_1': 0, ..., 'A_param_16': 1}, 
      'B': {'B_param_1': 0, ...}, 
      ... 
      'F': {'F_param_1': 0, ...}} 

class Container(): 
    def __init__(self, params): 
     self.InstanceA = ClassA(**params['A']) 
     self.InstanceB = ClassB(**params['B']) 
     ... 
     self.InstanceF = ClassF(**params['C']) 

class ClassA: 
    def __init__(self, 
       A_param_1=0, 
       ... 
       A_param_16=0.123): 
     # set param values to self. 
     self._A_param_1 = A_param_1 

class ClassF: 
    def __init__(self, foo): 
     self.foo = foo 

def main(): 
    c = 'F' 
    n = 23 
    cls = globals()['Class' + c] 
    o = cls(n) 
    print(o.foo) # => 23 

main() 

私は、おそらくJSONファイルに保存されている。このようなネストされた辞書の構成を、使用しますself.InstanceAにはsetattr()を使用できます。

関連する問題