2011-11-09 19 views
5

Aşağıdaki klasör yapısı vardır: benim durumumda, Temel sınıftan genişleten bir sınıf var modüllerin (örneğin some_module1.py) her İçindePython - Dinamik sınıf ithalat

- MyProject 
    - App1 
     - some_module1.py 
     - some_module2.py 
    - App2 
     - some_other_module1.py 
     - some_other_module2.py 

, Yapımcı .

Yapmaya çalıştığım şey dinamik olarak bu sınıfa yüklenmektir. Belirli bir yapımcı sınıfı için her bir "uygulama" paketi kontrol ve uzanan sağlayacak bir işlev yazmaya çalışıyorum

INSTALLED_APPS = (
    'App1', 
    'App2', 
) 

: Bunu yapmak için, ben şöyle "yüklü uygulamalar" bir listesi var üretici taban sınıfı. Böyle bir şey:

module_class = 'some_module1.SomeClass' 

# Loop through each package in the INSTALLED_APPS tuple: 
for app in INSTALL_APPS: 
    try: 
     #is the module_class found in this app? 
     #App1.some_module1.SomeClass - Yes 
     #App2.some_module1.SomeClass - No 

     # is the class we found a subclass of Producer? 
    exception ImportError: 
     pass 

Ben imp ve importlib deneme denedim ama ithalat bu tür işlemek için görünmüyor. Bunu başarabilmem için zaten var mı?

+0

Üzgünüz, ne istediğinizi bulmak mümkün değil - sözde kodunuz belirsiz. Python, doğru yerlerden gelen ulak sınıflarıyla ilgilenir, dostum. Böylece, herhangi bir App1.Class_, App1 modülünde tanımlandığı gibi "Producer" ı görecektir. – jsbueno

+0

Üzgünüm, olabildiğince açık olmaya çalıştım. Gönderiyi düzenledim ve daha mantıklı olmasını umuyorum. – Hanpan

cevap

5

Sen de bakabilirsiniz isteyebilirsiniz: dize olarak kendi adını bilerek modülleri ithal etmek

  • __import__(); Bir modülün tüm nesnelerinin isimlerini (öznitelikler, işlevler, vb) elde etmek için; Bir modülün nesneleri arasındaki sınıfları tanımlamak için
  • inspect.isclass(getattr(<module ref>, <object name>)); Belirli bir sınıftan, as explained here alt sınıflarını tanımlamak için
  • issubclass().

Bu araçlarla, belirli bir sınıfa ait olan belirli bir modüldeki tüm sınıfları tanımlayabilirsiniz.

Bu mekanizmayı, verilen modülden sınıfları dinamik olarak başlatmak için kullanıyorum, böylece güncelleştirmeleri otomatik olarak bir üst düzeyde hesaba katılacak şekilde.