我正在尝试从输入给方法的字符串动态地实例化一个类。
from pydoc import locate
name = "folder.subfolder.classname"
my_class = locate(name)
instance = my_class()
这样做会导致一个错误:
TypeError: 'module' object is not callable
我的问题是:我怎么知道我需要打哪个班?如果我硬编码这个值并执行my_class.classname()
,我可以实例化它,但是我希望最后一部分是动态的,而不是硬编码的。我怎么能这么做?
发布于 2017-12-22 09:33:40
编辑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()
发布于 2021-03-29 07:59:03
您没有在文件中找到类:
from pydoc import locate
name = "folder.subfolder.filename.classname"
my_class = locate(name)
instance = my_class()
https://stackoverflow.com/questions/47945162
复制