2011-06-05 51 views
8

我发现this,但那不是我想要做的。导入目录中的所有类?

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

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

的东西动态的,所以我没有让我的__init__.py每次编辑我添加其他文件。


glob解决方案似乎是

import A 
import B 
import C 

相当于这是不一样的。

+0

你想用这个做什么? – 2011-06-05 22:56:57

+0

这个答案有什么问题:http://stackoverflow.com/questions/1057431/loading-all-modules-in-a-folder-in-python/1057534#1057534? – viraptor 2011-06-05 22:58:10

+0

@Ignacio:最后一句话。我有大约15个型号,并且所有这些型号都需要一直导入。当这可以通过编程方式完成时,我不得不继续更新'__init __。py'。 – mpen 2011-06-05 23:08:32

回答

6

你可以这样做,但要记住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) 
+2

是的,我看到了答案,它不起作用。它导入模块,但不导入类。我必须以“address.Address”的形式访问该文件,而我只需要使用“Address”即可访问它。有一个区别。 – mpen 2011-06-05 23:06:38

+0

你应该使用'os.path.join(os.path.dirname(__ file__),'* .py')'而不是'os.path.dirname(__ file__)+“/ *。py”'。 – 2011-06-05 23:06:45

+0

@Mark调整了我的答案以反映这一点。 – zeekay 2011-06-05 23:44:26