我正在尝试从提供给方法的字符串动态地实例化一个类。
onKeyUp(event: any) {
this.service.search_word(event.target.value).subscribe(response =>{
this.searchResult = response
})
}
这样做会导致错误:
from pydoc import locate
name = "folder.subfolder.classname"
my_class = locate(name)
instance = my_class()
我的问题是:我怎样才能知道我需要打哪个班级?如果我对值进行硬编码并执行TypeError: 'module' object is not callable
我可以实例化它,但我希望最后一部分是动态的,而不是硬编码。我怎么能这样做?
答案 0 :(得分:2)
编辑2:
此解决方案将收集用户提供的模块中可用的所有类,然后简单地实例化第一个类。
import inspect
from pydoc import locate
name = "folder.subfolder.classname"
my_module = locate(name)
all_classes = inspect.getmembers(my_module, inspect.isclass)
if len(all_classes) > 0:
instance = all_classes[0][1]()
修改强>
从评论中收集我相信以下代码适用于您的用例:
from pydoc import locate
name = "folder.subfolder.classname"
my_module = locate(name)
class_name = name.rsplit('.')[-1]
my_class = getattr(my_module, class_name)
instance = my_class()
您似乎对哪些模块导致我们的错误传达感到有点困惑。 class.py并不指向一个类,而是指向一个模块。在该模块(您的class.py文件)中可以有多个类。对于上面的答案,我假设你的class.py文件中有一个与文件同名的类。
原始答案:
正如您的错误所示,您的my_class
变量实际上是一个模块对象。您提供的名称实际上并不指向您的班级,而是指向包含该班级的模块。
要按字符串从模块对象获取类,您可以执行以下操作:
my_class = getattr(module, class_name)
然后在您的示例代码中,您可以像这样实例化它:
instance = my_class()
将所有这些结合起来:
module_name = "folder.subfolder.module_name"
my_module = locate(module_name)
my_class = getattr(my_module, class_name)
instance = my_class()
答案 1 :(得分:0)
您没有在文件中找到该类:
from pydoc import locate
name = "folder.subfolder.filename.classname"
my_class = locate(name)
instance = my_class()