Я объявляю класс, а в методе __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)
Нужно ли ссылаться на эти массивы по имени атрибута, например. 'my_variable_one', или вы можете просто индексировать в контейнере' container_of_arrays [1] '. Поскольку это список, вы можете легко «добавлять» новые элементы и удалять их. – hpaulj