如何导入目录中的所有类?

14 投票
2 回答
23557 浏览
提问于 2025-04-16 19:00

我在这里找到了相关内容,但这并不是我想要的。

我想要导入一个文件夹里所有文件中的所有类。简单来说,我想把下面这段代码:

from A import *
from B import *
from C import *

换成一种动态的方式,这样每次我添加新文件的时候,就不需要一直去修改我的__init__.py文件了。


使用glob的解决方案似乎相当于:

import A
import B
import C

但这完全不是同一回事。

2 个回答

9

假设你的文件结构是这样的:

/Foo
    A.py
    B.py
    C.py

如果你想一次性导入所有内容,你需要在你想要导入的目录下创建一个叫做 __init__.py 的文件,并在里面写入以下代码:

__all__ = ['A', 'B', 'C']

在做完这些更改后,你的文件结构会变成这样:

/Foo
    A.py
    B.py
    C.py
    __init__.py

然后,你可以简单地使用:

from Foo import *
15

你可以这样做,不过要记住,isinstance(cls, type) 这个方法只适用于新式类。

import os, sys

path = os.path.dirname(os.path.abspath(__file__))

for py in [f[:-3] for f in os.listdir(path) if f.endswith('.py') and f != '__init__.py']:
    mod = __import__('.'.join([__name__, py]), fromlist=[py])
    classes = [getattr(mod, x) for x in dir(mod) if isinstance(getattr(mod, x), type)]
    for cls in classes:
        setattr(sys.modules[__name__], cls.__name__, cls)

撰写回答