2013-08-19 9 views
7

C'è un modo per inizializzare tutte le classi da un modulo python in una lista di oggetti senza nome?Inizializza tutte le classi di un modulo in oggetti senza nome in una lista

Esempio Ho un modulo di rules che contiene tutte le classi bambino da una regola di classe. A causa di questo, sono certo che saranno tutti implementare un metodo run() e avranno un attributo name che viene generato durante la chiamata di __init__

mi piacerebbe avere una lista di oggetti avviati dinamicamente da quelle classi. Inizializzando dinamicamente intendo che non devono essere nominati esplicitamente.

Le domande sono:

E 'possibile scorrere tutte le classi in un modulo?

È possibile avviare un oggetto senza nome?

risposta

8

Ci sono almeno due approcci che puoi seguire. È possibile ottenere tutte le sottoclassi di una classe chiamando il metodo __subclasses__() di una classe. Quindi, se la classe genitore è chiamato Rule, si potrebbe chiamare:

rule_list = [cls() for cls in Rule.__subclasses__()] 

Questo vi darà tutte le sottoclassi di Rule, e non li limito a quelle che si trovano in un particolare modulo.

Se si dispone di un handle per il modulo, è possibile scorrere il suo contenuto. In questo modo:

import rule 
rule_list = [] 
for name in dir(rule): 
    value = getattr(rule, name) 
    if isinstance(value, type) and issubclass(value, Rule): 
     rule_list.append(value()) 

Purtroppo, issubclass tiri TypeError se gli date un oggetto che non è una classe come primo argomento. Quindi devi gestirlo in qualche modo.

MODIFICA: si occupa dello stimolo issubclass per suggerimento di @ Blckknght.

+0

Meglio della mia risposta. Puoi usare 'inspect.isclass()' per evitare il 'TypeError'. –

+0

@AntonisChristofides True, puoi usare 'inspect.isclass()' come filtro. Cerco comunque di evitare di utilizzare qualsiasi cosa dal modulo 'inspect' nel codice di produzione. –

+0

Puoi anche usare 'isinstance (value, type)' per assicurarti di avere una classe. (Dovresti anche controllare 'types.ClassType' se devi supportare le classi vecchio stile, ma preferirei evitare quelle.) – Blckknght

Problemi correlati