python动态调用类

标签 python python-2.7 getattr

我想动态调用python类,

这些是我要调用的类

class AutosoukModelMakeFuzzyComparisonModule:
    def __init__(self,configurationLoader=None, moduleConfigurationFile=None, settings=None):
        pass

class DefaultFuzzyComparisonModule:
    def __init__(self,configurationLoader, moduleConfigurationFile, settings = None):
        pass

这些类也位于 fuzzymodules 文件夹中

我从 ** FuzzyComparisonPipeline.py** 调用它们,它与 fuzzymodules 位于同一目录中,如下所示:

for module in FuzzyComparisonPipeline.fuzzyModules:
        name = module['name']
        configurationLoader = module['configurationLoader']
        moduleConfigurationFile = module['moduleConfigurationFile']
        settings = module['settings']
        module_to_import = __import__('fuzzymodules.'+name)
        instanceOfModule = getattr(module_to_import, name).__init__(configurationLoader, moduleConfigurationFile, settings)
        #instanceOfModule(configurationLoader, moduleConfigurationFile, settings)
    return item

我遇到了这个错误:

   Traceback (most recent call last):
  File "path to my FuzzyComparisonPipeline.py", line 9, in process_item
    instanceOfModule = getattr(module_to_import, name).__init__(configurationLoader, moduleConfigurationFile, settings)
TypeError: module.__init__() takes at most 2 arguments (3 given)

我的问题是 init() 如何接受两个参数,如您所见,在这两个类中 init 接受三个参数

你能帮忙吗

我不能给你完整的代码,因为它太复杂了,其他一切都工作正常,我确信,我的问题是调用那个函数。

来自此 xml 的 for 循环的值

<FuzzyComparison>
    <Modules>
        <Module>
            <name>AutosoukModelMakeFuzzyComparisonModule</name>
            <configurationLoader>DefaultLoader</configurationLoader>
            <configurationFile>MakesModels.conf</configurationFile>
            <settings></settings>
        </Module>
        <Module>
            <name>DefaultFuzzyComparisonModule</name>
            <configurationLoader>DefaultLoader</configurationLoader>
            <configurationFile>Buildings.conf</configurationFile>
            <settings>
                <attribute>building</attribute>
                <second>2222duxk fuck fuck</second>
            </settings>
        </Module>
    </Modules>
    </FuzzyComparison>

最佳答案

您正在检索一个模块,而不是模块中的类; __import__() 函数返回顶级包,而不是嵌套模块本身。

你真的很想用importlib.import_module()相反,它的行为与您预期的一样。

接下来,您要调用这样检索到的类对象,而不是直接调用 __init__ 方法。让 Python 为您调用它,它会这样做以初始化您通过调用类创建的实例:

from importlib import import_module

for module in FuzzyComparisonPipeline.fuzzyModules:
    name = module['name']
    configurationLoader = module['configurationLoader']
    moduleConfigurationFile = module['moduleConfigurationFile']
    settings = module['settings']
    module_to_import = import_module('fuzzymodules.' + name)
    instance = getattr(module_to_import, name)(configurationLoader, moduleConfigurationFile, settings)

关于python动态调用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31627646/

相关文章:

python - 当 parentWidget 关闭时, float QDockWidget 不会关闭

python-2.7 - Wagtail Docker 六包冲突升级到 wagtail 1.7

python-3.x - 如何使用 getattr 进行多线程,每个属性一个线程?

python - 添加自定义对象会忽略带有运算符的 __getattr__

python - 不确定如何 XPath 到特定的网站元素

python - 在 python 中重写 __setattr__ 和 __getattribute__ 时,无法更新可变实例属性

python - Bottle:使用jinja2_view装饰器

javascript - 如何使用 python 将网页生成的列表获取到我的主机?

python - QuerySet 类型的对象不是 JSON 可序列化的 Django

python-2.7 - 无法在 ubuntu 14.04 上将 matplotlib 升级到 1.4.3