Как динамически создавать экземпляр класса в python?
У меня есть список имен классов и вы хотите динамически создавать их экземпляры. например:
names=[
'foo.baa.a',
'foo.daa.c',
'foo.AA',
....
]
def save(cName, argument):
aa = create_instance(cName) # how to do it?
aa.save(argument)
save(random_from(names), arg)
Как динамически создавать экземпляры в Python? спасибо!
Ответы
Ответ 1
Это часто называют отражением или иногда интроспекцией. Просмотрите похожие вопросы, на которые есть ответ на то, что вы пытаетесь сделать:
Имеет ли Python эквивалент класса Java для имени
Можете ли вы использовать строку для создания класса на Python
Ответ 2
Предполагая, что вы уже импортировали соответствующие классы, используя что-то вроде
from [app].models import *
все, что вам нужно сделать, это
klass = globals()["class_name"]
instance = klass()
Ответ 3
Вы можете использовать встроенный оператор python eval()
для создания экземпляров ваших классов.
Вот так:
aa = eval(cName)()
Ответ 4
Вы можете часто полностью исключить часть обработки строк.
import foo.baa
import foo.AA
import foo
classes = [ foo.baa.a, foo.daa.c, foo.AA ]
def save(theClass, argument):
aa = theClass()
aa.save(argument)
save(random.choice(classes), arg)
Обратите внимание, что мы не используем строковое представление имени класса.
В Python вы можете просто использовать сам класс.
Ответ 5
Это сработало для меня:
from importlib import import_module
class_str: str = 'A.B.YourClass'
try:
module_path, class_name = class_str.rsplit('.', 1)
module = import_module(module_path)
return getattr(module, class_name)
except (ImportError, AttributeError) as e:
raise ImportError(class_str)
Ответ 6
Лучший ответ, который я нашел:
Лучше всего сделать словарь:
объекты = {}
Имена = [объект1, объект2, объект3]
Для objname в именах: Объекты [ObjName] = имя_класс()
Найти в:https://www.thecodingforums.com/threads/create-object-name-from-string-value.712461/