动态导入并创建类实例

时间:2011-11-14 10:01:21

标签: python

使用我的python应用程序,我有40个模块(类),其中包含一些文本的解析器。在我的函数中,我只想实现并使用特定的模块。这些都在数据库中排序。

我现在知道我的解析器,并且同时拥有我要导入和创建的python文件名和类

然而....你怎么在python中实际做到这一点?

例如

file_name = 'lex_parser'
class_name = 'LexParser'

我该怎么做....

from {file_name} import {class_name}
Parser = {class_name}()

按照我的意思?

2 个答案:

答案 0 :(得分:5)

试试这个:

file_name = 'lex_parser'
class_name = 'LexParser'

Parser = getattr(__import__(file_name), class_name)

请注意,file_name不得包含.py

如果模块位于包中,则无效,因为__import__将返回顶级包。在这种情况下,您可以这样做:

import sys

file_name = 'parsers.lex_parser'
class_name = 'LexParser'

__import__(file_name)
Parser = getattr(sys.modules[file_name], class_name)

这适用于这两种情况,并由__import__函数documentation推荐。

在两个示例中,Parser是一个必须通常实例化的类:

parser = Parser()

答案 1 :(得分:3)

这样的事情怎么样:

module = __import__('my_module')
if hasattr(module, 'ClassName'):
    ClassName = module.ClassName
    my_object = ClassName()