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]