2011-09-28 30 views
7

我有一个来自动态导入的子包的模块;我如何迭代它包含的类?迭代动态导入的模块中定义的类

我一直在进口模块和上市这样的名字:

package = current_module.__name__ 
package = package[:package.rindex(".")] # get the package 
package = "%s.sub.%s"%(package,name) # make the name of the child 
print "(loading package %s)"%package 
module = __import__(package) # this succeeds 
for name,obj in inspect.getmembers(module): 
    print name,type(obj) 

仅打印模块的属性,而不是该模块定义的类类型:

__builtins__ <type 'dict'> 
__doc__ <type 'NoneType'> 
__file__ <type 'str'> 
__name__ <type 'str'> 
__package__ <type 'NoneType'> 
__path__ <type 'list'> 
imported_package <type 'module'> 

UPDATE

看来我的班不在__dict__除非fromlist非空!尽管如此,from-list中的值似乎并未得到验证; [""]似乎工作得很好,突然出现了班级!

任何人都可以解释为什么这是?

(标准的Debian蟒2.7.1+(R271:86832)

回答

17

示例:创建的名称映射到类的字典:

dict([(name, cls) for name, cls in mod.__dict__.items() if isinstance(cls, type)]) 

其中mod是加载模块

+0

这是行不通的,除非导入有一个fromlist-clause;问题已经更新 – Will

+0

哦,我认为你在一个try块中只能使用issubclass吗? – Will

+0

(首先)你对fromlist有所了解:我通常使用'没有]'为此。不知道为什么它是必要的。(第二)没有,我的意思是'isinstance',而不是'issubclass',没有'try'。每个类也是'type'类型的对象。 – pvoosten