Python 使用locate动态实例化类

Python 使用locate动态实例化类,python,python-3.x,reflection,Python,Python 3.x,Reflection,我试图从一个字符串动态实例化一个类,该字符串被提供给一个方法 from pydoc import locate name = "folder.subfolder.classname" my_class = locate(name) instance = my_class() 执行此操作会导致错误: TypeError: 'module' object is not callable 我的问题是:我怎样才能真正知道我需要给哪个班级打电话?如果我硬编码该值并执行my_class.classnam

我试图从一个字符串动态实例化一个类,该字符串被提供给一个方法

from pydoc import locate
name = "folder.subfolder.classname"
my_class = locate(name)
instance = my_class()
执行此操作会导致错误:

TypeError: 'module' object is not callable

我的问题是:我怎样才能真正知道我需要给哪个班级打电话?如果我硬编码该值并执行
my_class.classname()
我可以实例化它,但我希望最后一部分是动态的,而不是硬编码的。我该怎么做呢?

编辑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()
您似乎对导致我们沟通失误的模块有点困惑。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()

您没有在文件中找到该类:

从pydoc导入定位
name=“folder.subfolder.filename.classname”
my_class=定位(名称)
instance=my_class()

这不是格伦的选项。变量类的名称在哪里?你能提供更多关于你调用的locate函数的细节吗?因为您的问题似乎只是忘记了模块名。不要使用
“folder.subfolder.classname”
您应该尝试使用
“folder.subfolder.modulename.classname”
。模块名是python文件的名称,不带
.py
。locate来自pydoc,我已将其添加到问题中。结构是“folder\subfolder\class.py”,我正在尝试使用“folder.subfolder.class”访问该类。谢谢你,格伦。我确实想到了这一点,但想知道模块是否有一些属性允许我在不进行字符串操作的情况下获取名称。这是我的后退,但我正在寻找更健壮的东西。我有另一个解决方案,你会考虑更健壮,但是它仍然假设文件中只有一个类,在Python中通常不是你允许的假设。我会编辑我的帖子。