2011-11-14 101 views
0

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

我在点现在在哪里,我知道我的解析器,并且都将Python文件名和类我想导入和创建

但是....你如何真正做到这一点在Python?

例如;

file_name = 'lex_parser' 
class_name = 'LexParser' 

我该怎么办....

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

按照我的意思?

回答

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() 
3

怎么是这样的:

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

看起来很有希望,但是我得到的, 类名= module.ClassName AttributeError的:“模块”对象有没有属性' ClassName' – Wizzard

+1

@Wizzard我写的标识符只是一个例子,你可能不得不使用'getattr'来获得类。 –