动态导入并创建类实例
我有一个用Python写的应用程序,里面有40个模块(类),每个模块都包含一个用来解析文本的解析器。在我的函数里,我只想实例化并使用一个特定的模块。这些模块都已经在数据库里整理好了。
现在我已经知道了我的解析器,并且知道了我想要导入和创建的Python文件名和类名。
但是……在Python中到底该怎么做呢?
比如说;
file_name = 'lex_parser'
class_name = 'LexParser'
我该怎么做……
from {file_name} import {class_name}
Parser = {class_name}()
你明白我的意思吗?
2 个回答
3
这样怎么样:
module = __import__('my_module')
if hasattr(module, 'ClassName'):
ClassName = module.ClassName
my_object = ClassName()
6
试试这个:
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__
函数的文档中推荐的做法 文档。
在这两个例子中,Parser
是一个类,你需要像平常一样实例化它:
parser = Parser()