2011-09-28 7 views
7

içe; İçerdiği sınıflar üzerinde nasıl yineleyebilirim?yineleme sınıfları dinamik aktarılan bir çocuk paketinden bir modüle sahip dinamik

Ben modülü ithal ve bunun gibi isimler listeleme edilmiştir:

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) 

Bu yalnızca baskılar modül özelliklerini değil, modül tanımlar sınıf tipleri:

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

GÜNCELLEME

Sınıflarımın'de olmadığı anlaşılıyor. fromlist olmayan boş sürece! Listedeki değerler doğrulanmış gibi görünmüyor; [""] sadece iyi çalışıyor ve aniden sınıflar ortaya çıkıyor! Bu yüzden

Herkes açıklayabilir misiniz? sınıflara adlarla eşleştiren dicti oluşturmak için:

(Ubuntu'dan piton 2.7.1+ (r271: 86832)

cevap

17

Örnek mod yüklenen modülü

olan

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

+0

İçe aktarma bir dışlama listesi içermedikçe çalışmıyor, soru güncelleştirildi – Will

+0

Ah ve küçük nokta Ben bir deneme bloğunda nubus issubclass olduğunu düşünüyorum? – Will

+0

(İlk) Gönderen hakkında haklısınız: Hiçbiri] 'Bunun için neden gerekli olduğunu bilmiyorum. (İkinci) Hayır Ben gerçekten "isinstance", "issclass" ve "denemeden" demek istedim. Her sınıf ayrıca 'tip' tipi bir nesnedir. – pvoosten