我有一组类名,并希望动态创建它们的实例。例如:
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中动态创建这些实例?谢谢!
我有一组类名,并希望动态创建它们的实例。例如:
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中动态创建这些实例?谢谢!
假设你已经使用类似以下的方式导入了相关的类
from [app].models import *
你需要做的就是
klass = globals()["class_name"]
instance = klass()
__import__
,对于更新的代码,您可以切换到 importlib
http://docs.python.org/dev/library/importlib.html。 (py>=2.7 | >=3.1) - SiggyF这对我有用:
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)
eval()
语句来实例化您的类。就像这样:aa = eval(cName)()
注意!
使用eval是非常危险的,是许多基于代码注入的安全风险的关键。
cName
来自用户的某些输入,那么它是危险的,因为黑客可以在其中注入Python代码:这是真的,但很多时候你只需要从文本文件或仅由开发人员/管理员控制的环境变量设置应用程序,这种情况下足够安全和简单。 - Mariano Ruizimport 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)
type(cName)(**arguments)
。 - KIC我的问题是,我希望在命令行中使用字符串指定参数将其传递到__init__
中。例如,相当于
import a.b.ClassB as ClassB
instance = ClassB.ClassB('World')
命令行上的字符串是"a.b.ClassB.ClassB('World')"
以下是模块a.b.ClassB中的类
class ClassB():
def __init__(self, name:str):
self._name = name
def hello(self):
print("Hello " + self._name + "!")
我们可以使用以下方式创建这个类:
import importlib
def create_instance(class_str:str):
"""
Create a class instance from a full path to a class constructor
:param class_str: module name plus '.' plus class name and optional parens with arguments for the class's
__init__() method. For example, "a.b.ClassB.ClassB('World')"
:return: an instance of the class specified.
"""
try:
if "(" in class_str:
full_class_name, args = class_name = class_str.rsplit('(', 1)
args = '(' + args
else:
full_class_name = class_str
args = ()
# Get the class object
module_path, _, class_name = full_class_name.rpartition('.')
mod = importlib.import_module(module_path)
klazz = getattr(mod, class_name)
# Alias the the class so its constructor can be called, see the following link.
# See https://www.programiz.com/python-programming/methods/built-in/eval
alias = class_name + "Alias"
instance = eval(alias + args, { alias: klazz})
return instance
except (ImportError, AttributeError) as e:
raise ImportError(class_str)
if __name__ == "__main__":
instance = create_instance("a.b.ClassB.ClassB('World')")
instance.hello()
我找到的最佳答案是: 更好的方法是创建一个字典: objects = {} Names = [object1, object2, object3]
对于Names中的每个objname: objects[objname] = classname()
来源: https://www.thecodingforums.com/threads/create-object-name-from-string-value.712461/