gpt4 book ai didi

python - 使用locate动态实例化类

转载 作者:行者123 更新时间:2023-12-01 02:21:02 25 4
gpt4 key购买 nike

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

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

您似乎确实对哪些模块感到有点困惑,这导致了我们的沟通不畅。 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()

关于python - 使用locate动态实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47945162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com