2016-09-25 3 views
0

Я объявляю класс, а в методе __init__ я объявляю две переменные, которые будут связаны с экземпляром этого класса. Каждая объявленная переменная инициализируется как массив нулей NumPy, который позже заполняется другими данными.Автоматическое включение объектов в список Python

В какой-то момент, за пределами этого метода __init__, мне нужно пройти через объект, содержащий каждую из этих переменных (массивы NumPy), и сбросить значения массива в каждом до нуля. Таким образом, в методе __init__ я хотел бы добавить все эти переменные в список, чтобы позже выполнить итерацию. Если я сделаю это вручную, это тривиально.

Однако мне нужно часто добавлять и удалять некоторое количество этих переменных, объявляемых в __init__. Каждый раз, когда я это делаю, я не хочу вручную настраивать переменные, которые содержатся в списке.

Как создать list, dict или другой контейнер этих переменных, который автоматически настраивается, поэтому он содержит все эти инициализированные переменные, независимо от количества этих переменных? В качестве дополнительного осложнения self.container_of_arrays не должен содержать «других» переменных от __init__, таких как self.array_length.

Что у меня есть, где self.container_of_arrays должен в настоящее время быть отрегулирован вручную, если self.my_variable_three создан:

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

Update: ответ

XLI обеспечивает правильное решение. Как и было предложено, можно получить доступ к массивам по имени, используя dict или OrderedDict. Для тех, кто хочет сделать это, вот код, который я на самом деле реализован:

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

Вместо того чтобы создавать переменную для каждого Numpy массива, почему бы вам не просто создать список массивов, содержащих каждый массив, нужно , и ссылаться на них по индексу?

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

Или, если вам нужно получить доступ к массиву по имени, вы можете использовать dict только с строкой (имя массива) в качестве ключа для каждого массива.

Смежные вопросы