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
。再次调整,看看这对你是否有效。