【问题标题】:How to access a class from a dynamically imported module如何从动态导入的模块中访问一个类
【发布时间】:2015-09-19 05:07:01
【问题描述】:

我已经动态导入了一个模块:

module_object = importlib.import_module(audio_module)

现在,如果我得到与该模块关联的属性列表:

print dir(module_object)

我得到以下信息:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'aud_shell', 'shlex', 'sys']

我想访问位于该模块中的“aud_shell”类。但是由于这个模块是动态导入的,我不知道它里面有什么类。如何在这个导入的模块中搜索以获取类名,然后访问该类?

例如:

  1. 动态导入模块
  2. 获取模块内的类名
  3. 访问该类中的方法

最后我将不得不做这样的事情:

module_object.aud_shell.some_method()

我希望我正确地解释了这一点。如果我没有任何意义,请告诉我。谢谢。

【问题讨论】:

    标签: python class dynamic import module


    【解决方案1】:

    实际上,在发布此问题 5 分钟后,我能够解决它,但以防万一其他人在这里尝试做同样的事情:

    动态导入模块后:

    module_object = importlib.import_module(audio_module)
    

    您可以通过以下方式获取该类:

    module_class = inspect.getmembers(module_object, inspect.isclass)
    

    然后您需要使用模块创建该类的对象。这是由以下人员完成的:

    class_object = getattr(module_object, module_class)
    

    现在,当我打印“class_object”时,我得到以下信息:

    >>>print class_object
    audio_module.aud_shell
    

    现在我只需要弄清楚如何获取类中的方法列表并访问这些方法...

    【讨论】:

    • 您使用dir() 获取方法列表,并使用上面使用的getattr() 访问它们。
    • Hwat getattrdoes 不是“使用模块创建该类的对象” - 它只是检索对象的属性。模块的属性是其中定义的函数和类。另外inspect.getmembers 不会返回一个可以在 getattr 调用中使用的字符串——(上面的代码不应该工作)——它会退出一个带有一对名称/对象的 2 元组列表。因此,如果您在模块中有一个类 inspect.getmembers(module_object, inspect.isclass)[0][1] 已经是该类,则无需调用 getattr
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 2011-04-04
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2019-12-04
    • 2020-12-30
    相关资源
    最近更新 更多