使用locate动态实例化类

时间:2017-12-22 17:21:03

标签: python python-3.x reflection

我正在尝试从提供给方法的字符串动态地实例化一个类。

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 我可以实例化它,但我希望最后一部分是动态的,而不是硬编码。我怎么能这样做?

2 个答案:

答案 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()