动态导入模块并在Python中实例化一个类

时间:2011-08-24 09:29:16

标签: python parsing import

我的问题类似于this one,但我想继续前进。

我正在解析配置文件,该文件按名称调用许多操作(带参数)。例如:

"on_click": "action1", "args": {"rate": 1.5} 

动作是python类,继承自基类Action类,可以接受命名参数。它们存储在项目的“actions”子目录中,前缀为a_。我希望能够通过简单地删除新文件来添加新操作,而无需更改任何其他文件。项目结构如下:

myapp/
    actions/
        __init__.py
        baseaction.py
        a_pretty.py
        a_ugly.py
        ...
    run.py

所有操作类都提供PerformAction()方法和GetName()方法,这是配置文件所引用的方法。在此示例中,a_pretty.py定义了一个名为PrettyPrinter的类。在GetName()上拨打PrettyPrinter会返回“action1”。

我想将PrettyPrinter类添加到以“action1”为键的字典中,因此我可以像下面这样实例化它的新实例:

args = {'rate': the_rate}
instantiated_action = actions['action1'](**args)
instantiated_action.PerformAction()

目前,我有以下内容:

actions = [os.path.splitext(f)[0] for f in os.listdir("actions")
           if f.startswith("a_") and f.endswith(".py")]

for a in actions:

    try:
        module = __import__("actions.%s" % a, globals(), locals(), fromlist=["*"])
        # What goes here?
    except ImportError:
        pass

这是导入动作文件,如果我打印dir(module),我会看到类名;我只是不知道接下来应该做什么(或者如果整个方法是正确的方法......)。

1 个答案:

答案 0 :(得分:2)

如果module中的所有内容都是您应该实例化的类,请尝试以下方法:

for in actions:

try:
    module = __import__("actions.%s" % a, globals(), locals(), fromlist=["*"])
    # What goes here?
    # let's try to grab and instanciate objects
    for item_name in dir(module):
        try:
           new_action = getattr(module, item_name)()
           # here we have a new_action that is the instanciated class, do what you want with ;)
        except:
           pass

except ImportError:
    pass