2016-09-25 2 views
0

Ich deklariere eine Klasse, und in der __init__-Methode deklariere ich zwei Variablen, die einer Instanz dieser Klasse zugeordnet werden. Jede deklarierte Variable wird als ein NumPy-Array von Nullen initialisiert, das später mit anderen Daten gefüllt wird.Automatisierte Aufnahme von Objekten in Python-Liste

Irgendwann außerhalb dieser __init__ Methode muss ich ein Objekt durchlaufen, das jede dieser Variablen enthält (NumPy-Arrays) und die Array-Werte in jedem auf Null zurücksetzen. Daher möchte ich in der __init__-Methode alle diese Variablen zu einer Liste hinzufügen, um sie später zu durchlaufen. Wenn ich das einmal manuell mache, ist das trivial.

Allerdings muss ich einige dieser Variablen, die in __init__ deklariert sind, häufig hinzufügen und entfernen. Jedes Mal, wenn ich das mache, möchte ich die Variablen, die in der Liste enthalten sind, nicht manuell anpassen müssen.

Wie kann ich einen list, dict oder einen anderen Container dieser Variablen erstellen, der sich automatisch anpasst, so dass er alle Variablen enthält, die initialisiert werden, unabhängig von der Anzahl dieser Variablen? Als zusätzliche Komplikation darf self.container_of_arrays keine "anderen" Variablen von __init__, wie self.array_length enthalten.

Was ich habe, wo self.container_of_arrays muss zur Zeit manuell eingestellt werden, wenn ein self.my_variable_three erstellt:

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] 

Ich versuchte, meine Variablen innerhalb eines dict zu erklären, so dass von Anfang an sie innerhalb dieser dict enthalten sind , aber dies führt dazu, dass Verweise auf nicht definierte Variablen vorhanden sind. Z.B.

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)) 
              ]) 

Update:

xli Antwort liefert die richtige Lösung. Wie vorgeschlagen, ist es möglich, mit einem Dict oder OrderedDict auf die Arrays nach Namen zuzugreifen. Für alle, die so tun will, hier ist der Code, den ich tatsächlich implementiert haben:

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

Müssen Sie diese Arrays nach Attributnamen referenzieren, z. 'my_variable_one', oder können Sie einfach im Container 'container_of_arrays [1]' indexieren. Da es sich um eine Liste handelt, können Sie einfach neue Objekte anhängen und löschen. – hpaulj

Antwort

1

Anstatt eine Variable für jede numpy Array zu erstellen, warum Sie nicht nur eine Liste von Arrays erstellen jedes Array enthält, die Sie brauchen , und referenzieren sie nach Index?

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 
     ] 

Dann können Sie jedes Array als self.arrays[i] durch den Index zuzugreifen.

Oder, wenn Sie auf das Array nach Name zugreifen müssen, können Sie ein Dict mit nur einer Zeichenfolge (der Name des Arrays) als Schlüssel für jedes Array verwenden.