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

使用getattr从字符串中的名称中获取属性。换句话说,获取实例为

instance = getattr(modul, class_name)()

复制粘贴代码片段:

import importlib
def str_to_class(module_name, class_name):
    """Return a class instance from a string reference"""
    try:
        module_ = importlib.import_module(module_name)
        try:
            class_ = getattr(module_, class_name)()
        except AttributeError:
            logging.error('Class does not exist')
    except ImportError:
        logging.error('Module does not exist')
    return class_ or None

如果你想从foo中得到这句话。Bar import foo2来动态加载,你应该这样做

foo = __import__("foo")
bar = getattr(foo,"bar")
foo2 = getattr(bar,"foo2")

instance = foo2()

从上面的例子中,我不能完全达到我的用例,但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