python 动态调用 类
python calling classes dynamically
我想动态调用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() 如何接受 2 个参数,如您所见,在 类 和 init[=43= 中] 接受三个参数
你能帮忙吗
我不能给你完整的代码,因为它太复杂了,其他一切都工作正常,我确信,我的问题是调用那个函数。
for 循环的值来自此 xml
<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>
来自documentation of __import__()
-
__import__(name[, globals[, locals[, fromlist[, level]]]])
When the name variable is of the form package.module, normally, the top-level package (the name up till the first dot) is returned, not the module named by name. However, when a non-empty fromlist argument is given, the module named by name is returned.
(强调我的)
所以在你的情况下,模块 - fuzzymodules
被返回 - 而不是包含你的 class.
的模块
您应该将 fromlist
参数指定为 name
。例子-
module_to_import = __import__('fuzzymodules.'+name, fromlist=name)
另外,还有一个问题就是不能直接调用class的__init__()
函数为其创建对象,而是直接调用,例子-
instanceOfModule = getattr(module_to_import, name)(configurationLoader, moduleConfigurationFile, settings)
__init__()
对象创建后调用函数进行初始化
您正在检索 模块 ,而不是模块中的 class; __import__()
函数 returns 顶级包,而不是嵌套模块本身。
您真的想在这里使用 importlib.import_module()
,它的行为符合您的预期。
接下来,您要调用这样检索到的 class 对象,而不是直接调用 __init__
方法。让 Python 为您调用它,它将通过调用 class:
来初始化您创建的实例
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类,
这些是我要调用的类
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() 如何接受 2 个参数,如您所见,在 类 和 init[=43= 中] 接受三个参数
你能帮忙吗
我不能给你完整的代码,因为它太复杂了,其他一切都工作正常,我确信,我的问题是调用那个函数。
for 循环的值来自此 xml
<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>
来自documentation of __import__()
-
__import__(name[, globals[, locals[, fromlist[, level]]]])
When the name variable is of the form package.module, normally, the top-level package (the name up till the first dot) is returned, not the module named by name. However, when a non-empty fromlist argument is given, the module named by name is returned.
(强调我的)
所以在你的情况下,模块 - fuzzymodules
被返回 - 而不是包含你的 class.
您应该将 fromlist
参数指定为 name
。例子-
module_to_import = __import__('fuzzymodules.'+name, fromlist=name)
另外,还有一个问题就是不能直接调用class的__init__()
函数为其创建对象,而是直接调用,例子-
instanceOfModule = getattr(module_to_import, name)(configurationLoader, moduleConfigurationFile, settings)
__init__()
对象创建后调用函数进行初始化
您正在检索 模块 ,而不是模块中的 class; __import__()
函数 returns 顶级包,而不是嵌套模块本身。
您真的想在这里使用 importlib.import_module()
,它的行为符合您的预期。
接下来,您要调用这样检索到的 class 对象,而不是直接调用 __init__
方法。让 Python 为您调用它,它将通过调用 class:
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)