2011-11-09 5 views
5

ho la seguente struttura di cartelle:Python - classe di importazione dinamica

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

Dentro ciascuno dei moduli (some_module1.py per esempio) c'è una classe che si estende da una classe base, nel mio caso, Produttore .

Quello che sto cercando di fare è caricare dinamicamente in questa classe. Per fare questo, ho una lista di "applicazioni installate", che assomiglia a questo:

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

Sto cercando di scrivere una funzione che controllerà ogni pacchetto "app" per una particolare classe di produttore e garantire che si estende da la classe di base del produttore. Qualcosa di simile a questo:

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 

Ho provato a sperimentare con imp e importlib, ma non sembra per gestire questo tipo di importazione. Devo comunque essere in grado di raggiungere questo obiettivo?

+0

Spiacente: non è possibile capire cosa si desidera: lo pseudocodice non è chiaro. Python si prende cura delle classi abse provenienti dai posti giusti, salvezza. In modo che App1.Class_ appaia "Producer" così come è definito all'interno del modulo App1. – jsbueno

+0

Scusa, ho cercato di essere il più chiaro possibile. Ho modificato il post e spero che abbia più senso. – Hanpan

risposta

5

Si consiglia di dare un'occhiata a:

  • __import__() di importare i moduli conoscendo il loro nome come stringa;
  • dir() per ottenere i nomi di tutti gli oggetti di un modulo (attributi, funzioni, ecc.);
  • inspect.isclass(getattr(<module ref>, <object name>)) per identificare classi tra gli oggetti di un modulo;
  • issubclass() per identificare le sottoclassi di una determinata classe, as explained here.

Con questi strumenti, è possibile identificare tutte le classi in un dato modulo, che ereditano una determinata classe.

Sto usando questo meccanismo per istanziare dinamicamente le classi dal modulo dato, in modo che i loro aggiornamenti vengano automaticamente presi in considerazione a un livello superiore.