在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从字符串中的名称中获取属性。换句话说,获取实例为

instance = getattr(modul, class_name)()

其他回答

可以简单地使用pydoc。定位功能。

from pydoc import locate
my_class = locate("module.submodule.myclass")
instance = my_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)()

使用下面的代码片段:

def to_class(path:str):
    try:
        from pydoc import locate
        class_instance = locate(path)
    except ImportError:
        print('Module does not exist')
    return class_instance or None

用法:

如果你的类名是MyClass并且位于my_app.models中。MyClass:

path = "my_app.models.MyClass"
my_class = to_class(path)

如果你想从字符串中导入一个类和方法,你应该这样做:

dynamic_import 
│   my_class.py
│      
└───subfolder
│   │   my_subfolder_module.py
│   │

my_subfolder_module.py

 class MySubfolderClass():
        def test_method(self):
            print ("Hello World")

main.py

import importlib 
  
module = importlib.import_module('subfolder.my_subfolder_module')
class_ = getattr(module, "MySubfolderClass")
method_instance = getattr(class_(),"test_method")
method_instance()
#it will output the result of the test method, which is "Hello World"