如何导入目录中的所有类?
我在这里找到了相关内容,但这并不是我想要的。
我想要导入一个文件夹里所有文件中的所有类。简单来说,我想把下面这段代码:
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)