在python中,我必须实例化某个类,知道它在字符串中的名称,但这个类“生活”在一个动态导入的模块中。示例如下:
loader类脚本:
import sys
class loader:
def __init__(self, module_name, class_name): # both args are strings
try:
__import__(module_name)
modul = sys.modules[module_name]
instance = modul.class_name() # obviously this doesn't works, here is my main problem!
except ImportError:
# manage import error
some-dynamically-loaded-module脚本:
class myName:
# etc...
我使用这种安排使加载器类使用任何动态加载模块,遵循动态加载模块中的某些预定义行为…
你可以使用getattr
getattr(module, class_name)
访问类。更完整的代码:
module = __import__(module_name)
class_ = getattr(module, class_name)
instance = class_()
正如下面提到的,我们可以使用importlib
import importlib
module = importlib.import_module(module_name)
class_ = getattr(module, class_name)
instance = class_()
你可以使用getattr
getattr(module, class_name)
访问类。更完整的代码:
module = __import__(module_name)
class_ = getattr(module, class_name)
instance = class_()
正如下面提到的,我们可以使用importlib
import importlib
module = importlib.import_module(module_name)
class_ = getattr(module, class_name)
instance = class_()
从上面的例子中,我不能完全达到我的用例,但Ahmad给了我最接近的(谢谢)。对于那些将来读到这篇文章的人来说,下面是对我有用的代码。
def get_class(fully_qualified_path, module_name, class_name, *instantiation):
"""
Returns an instantiated class for the given string descriptors
:param fully_qualified_path: The path to the module eg("Utilities.Printer")
:param module_name: The module name eg("Printer")
:param class_name: The class name eg("ScreenPrinter")
:param instantiation: Any fields required to instantiate the class
:return: An instance of the class
"""
p = __import__(fully_qualified_path)
m = getattr(p, module_name)
c = getattr(m, class_name)
instance = c(*instantiation)
return instance