动态导入并创建类实例

0 投票
2 回答
2311 浏览
提问于 2025-04-17 06:17

我有一个用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()

撰写回答