2016-09-25 12 views
0

私はクラスを宣言していますが、__init__メソッドでは、そのクラスのインスタンスに関連付けられる2つの変数を宣言しています。宣言された各変数は、NumPyの0の配列として初期化され、後で他のデータで埋められます。Pythonリスト内のオブジェクトの自動包含

この__init__メソッドの外では、これらの変数(NumPy配列)のそれぞれを含むオブジェクトをループし、それぞれの配列値をゼロにリセットする必要があります。したがって、__init__メソッドでは、これらの変数をすべてリストに追加して、後で反復処理したいと考えています。一度手動で行うと、それは簡単です。

しかし、私は頻繁に追加し、これらの変数のいくつかを削除する必要があります__init__で宣言されている。私がそれをするたびに、リストに含まれている変数を手動で調整する必要はありません。

listdict、またはこれらの変数の数にかかわらず、これらの変数が初期化されるように自動的に調整されるこれらの変数のコンテナを作成するにはどうすればよいですか?さらに複雑な問題として、self.container_of_arraysには、の「その他」の変数(例えば、self.array_length)を含めてはいけません。 self.my_variable_threeが作成されている場合self.container_of_arraysは現在、手動で調整する必要があります私が持っているもの

、:

class generic_class(): 
    def __init__(self, array_width_one, array_width_two): 
    self.array_length = some_integer 

    self.my_variable_one = numpy.zeros((self.array_length, array_width_one), dtype=float) 
    self.my_variable_two = numpy.zeros((self.array_length, array_width_two), dtype=float) 

    self.container_of_arrays = [self.my_variable_one, self.my_variable_two] 

非常に彼らはその中に含まれている開始からのように、私は、dict以内に私の変数を宣言しようとしたdictこれは、未定義の変数への参照が存在することにつながります。例えば。

self.container_of_arrays = OrderedDict([(self.my_variable_one, numpy.zeros((self.array_length, array_width_one), dtype=float)), 
              (self.my_variable_two, numpy.zeros((self.array_length, array_width_two), dtype=float)) 
              ]) 

更新:

XLIの答えは正しいソリューションを提供します。提案されているように、dictまたはOrderedDictを使って名前で配列にアクセスすることができます。そうしたい人のために、ここで私が実際に実装したコードです:代わりに、各numpyの配列のための変数を作成する

my_data = [('variable_one_name', len(variable_one_data)), 
      ('variable_two_name', len(variable_two_data)), 
      ] # Intentionally outside the class in a location where variables are added by the user 

class generic_class(): 
    def __init__(self, array_length, my_data): 

    self.container_of_arrays = OrderedDict((variable_name, numerix.zeros((array_length, array_width), dtype=float)) 
                for variable_name, array_width in my_data) 
+0

これらの配列を属性名で参照する必要がありますか? 'my_variable_one'か、単にコンテナ' container_of_arrays [1] 'にインデックスを付けることができます。これはリストなので、簡単に新しい項目を追加して削除することができます。 – hpaulj

答えて

1

は、なぜあなたはちょうどあなたが必要とする各配列を含む配列のリストを作成しないでください、それらをインデックスで参照しますか?

class generic_class(): 
    def __init__(self, array_length, array_widths=[]): 
     self.array_length = array_length 
     self.arrays = [ 
      numpy.zeros((self.array_length, array_width), dtype=float) 
      for array_width in array_widths 
     ] 

次に、インデックスで各アレイにself.arrays[i]としてアクセスできます。

名前で配列にアクセスする必要がある場合は、各配列のキーとして文字列(配列の名前)だけを使用することができます。

関連する問題