python возможно ли создание экземпляров класса как строк

Нужны два десятка экземпляров класса вида self.model1, тип экземпляров np.array. Можно ли это делать в цикле?

Что-то типа такого:

class TestClass():
    def __init__(self, n):
        self.n = n

    def func(self):
        for i in range(1, self.n + 1, 1):
            # пытался так но не получается:
            # model_ = 'model{}.format(i)
            # self.model_ = model_
            # self.model_ = np.ones((0, 2))
            pass

На выходе нужны экземпляры класса с именами self.model1, self.model2, ... , self.modeln типа np.array


Ответы (2 шт):

Автор решения: CameL

Экземпляры класса создаются вне его. Поэтому если вам нужно два десятка экземпляров класса TestClass, вы можете прописать их создание в цикле, а в конструкторе прописать создание атрибута model_

import numpy as np

class TestClass():
    def __init__(self):
        self.model_ = np.ones((1, 2))

model_list = []
for i in range(20):
    model_list.append(TestClass())
    print(model_list[i].model_)
→ Ссылка
Автор решения: Amgarak

Почему бы и нет, через setattr можно добавлять новые объекты классу:

import numpy as np

class TestClass():
    def __init__(self, n):
        self.n = n

    def func(self):
        for i in range(1, self.n + 1):
            setattr(self, f"model{i}", np.ones((3, 2)))


test = TestClass(5)
test.func()

# для теста перезаполним 
test.model3.fill(5)

# а через getattr их можно через цикл посмотреть
for i in range(1, test.n + 1):
    model_name = f"model{i}"
    model_value = getattr(test, model_name)
    print(f"{model_name}: {type(model_value)}")
    print(model_value)   

# для наглядности можно посмотреть что все объекты точно были добавлены
dir_test= dir(test)
print(dir_test)

Вывод:

model1: <class 'numpy.ndarray'>
[[1. 1.]
 [1. 1.]
 [1. 1.]]
model2: <class 'numpy.ndarray'>
[[1. 1.]
 [1. 1.]
 [1. 1.]]
model3: <class 'numpy.ndarray'>
[[5 5]
 [5 5]
 [5 5]]
model4: <class 'numpy.ndarray'>
[[1. 1.]
 [1. 1.]
 [1. 1.]]
model5: <class 'numpy.ndarray'>
[[1. 1.]
 [1. 1.]
 [1. 1.]]
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'func', 'model1', 'model2', 'model3', 'model4', 'model5', 'n']

[Program finished]
→ Ссылка