2011-06-05 15 views
8

this'u buldum, ancak yapmak istediğim şey bu değil.Dizindeki tüm sınıfları içe aktarın mı?

Dizindeki tüm dosyalardaki tüm sınıfları içe aktarmak istiyorum. Temelde, bu değiştirmek istiyor:

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

dinamik bir şey ile, benim __init__.py her zaman düzenlemeye devam yok ki ben başka bir dosya ekleyin.


glob çözüm aynı hiç değil

import A 
import B 
import C 

eşdeğer gibi görünüyor.

+0

Bu konuda ne yapmak istiyorsunuz? –

+0

Ve bu sorunun cevabı: http://stackoverflow.com/questions/1057431/loading-all-modules-in-a-folder-in-python/1057534#1057534? – viraptor

+0

@Ignacio: Son cümle. Her zaman 15 modelim var ve hepsinin de ithal edilmesi gerekiyor. Programlı olarak yapılabildiğinde '__init __. Py' güncellenmemeye devam etmem gerekiyor. – mpen

cevap

6

isinstance(cls, type) yalnızca yeni stil sınıflarıyla çalışılsa da aklınızda bulundurun.

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

Evet, cevabı gördüm, işe yaramıyor. Modülleri içe aktarıyor, ancak sınıfları değil. Dosyaya 'address.Address' olarak erişmem gerekirken, sadece 'Address' ile erişebilmem gerekir. Bir fark var. – mpen

+0

'os.path.join (os.path.dirname (__ file__),' * .py ') '' os.path.dirname (__ file__) +'/*. Py ''yerine kullanmalısınız. –

+0

@Mark Cevabımı bunu yansıtmak için ayarladı. – zeekay

İlgili konular