Python 导入目录中的所有类?

Python 导入目录中的所有类?,python,Python,我发现了,但那不是我想做的 我想导入目录中所有文件中的所有类。基本上,我想替换这个: from A import * from B import * from C import * 使用动态的东西,这样我就不必每次添加另一个文件时都不断编辑我的\uuuu init\uuuu.py glob解决方案似乎与 import A import B import C 这一点都不一样。您可以这样做,但请记住isinstance(cls,type)仅适用于新样式的类 import os, sys pa

我发现了,但那不是我想做的

我想导入目录中所有文件中的所有类。基本上,我想替换这个:

from A import *
from B import *
from C import *
使用动态的东西,这样我就不必每次添加另一个文件时都不断编辑我的
\uuuu init\uuuu.py


glob
解决方案似乎与

import A
import B
import C

这一点都不一样。

您可以这样做,但请记住
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)

假设您的文件结构如下所示:

/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 *

你想用这个来达到什么目的?这个答案有什么错:?@Ignacio:你没有道理。为什么?少打字。不易出错。别忘了更新文件。节省时间。我真的需要证明这一点吗?@Ignacio:不,没有插件。它不应该像你把一个文件放在里面,然后包含一个插件。一切都将由我来建造。我有一大堆的类,我把它们都分成了不同的文件。框架需要在启动时将它们全部加载,这样它就知道它们的存在,而且它还使我可以轻松地使用它们,而无需一直导入十几种不同的东西。@AJ/Greg:也许吧。但他们是班级。除非它们被执行,否则它们不太可能引入细微的bug。是的,我看到了答案,它不起作用。它导入模块,但不导入类。我必须以
address.address
的身份访问该文件,而我只需要
address
就可以访问它。这是有区别的。你应该使用
os.path.join(os.path.dirname(\uuuuu file\uuuu),'*.py')
而不是
os.path.dirname(\uu file\uuuu)+“/*.py”
@Mark调整了我的答案,以反映这一点。Hrm…关闭。这个
。.join([pkg,py])
需要再上一层。i、 例如,我不得不将其替换为
。.join(['shippings',pkg,py])
,因为我的项目的根目录更高一级。我们不能得到模块的绝对路径,这样就不必硬编码吗?@Mark Yeah sure,无论如何应该使用
\uuuu name\uuuu
。再次调整,看看这对你是否有效。