2011-11-14 147 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'來獲得類。 –