2011-09-28 18 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の値は検証されていないようです。 [""]はうまくいくように見えますが、突然クラスが表示されます!

誰でもこの理由を説明できますか?クラスに名前をマップする辞書を作成する:

(標準Ubuntuのパイソン2.7.1+(R271:86832)

答えて

17

例modは、ロードされたモジュール

ある

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

+0

importがfromlist-clauseを持っていないとうまくいきません;質問が更新されました – Will

+0

私はあなたがtryブロック内でissubclassをやっていると思いますか? – Will

+0

(最初に)それが必要なのか分からない(二番目)いいえ私は本当に 'isinstance'を意味し、' issubclass'ではなく 'try'を伴わないことを意味しました。各クラスは、型 '型'のオブジェクトでもあります。 – pvoosten

関連する問題