2011-09-28 31 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