2012-11-29 4 views
8

ho modulo foo, all'interno di questo modulo I creata dinamicamente:pitone come registrarsi classe dinamica nel modulo

def superClassCreator(): 
    return type("Bar", (object,), {}) 

Ora, quello che voglio raggiungere è quello di rendere questa nuova classe dinamica visibile come una classe di questo modulo:

import foo 
dir(foo) 
>>> [... 'Bar' ...] 

Sai come fare?

+0

grammatica nazista ovunque;) – mnowotka

+1

Sintassi nazista! :-P –

risposta

13

È possibile utilizzare Bar = superClassCreator() in foo (a livello di modulo).

In alternativa, da un altro modulo, è possibile aggiungere Bar come un attributo foo:

import foo 

foo.Bar = superClassCreator() 

o, se il nome deve essere presa dalla classe generata:

import foo 

generatedClass = superClassCreator() 
setattr(foo, generatedClass.__name__, generatedClass) 

Dall'interno Modulo foo, è possibile impostarlo direttamente su globals():

con una dichiarazione opzionale del per rimuovere nuovamente il nome generatedClass dallo spazio dei nomi.

+0

A livello globale. –

+0

Cosa succede se il nome viene generato dinamicamente? Non puoi farlo in quel caso. – mnowotka

+0

Quando stampo generateClass .__ module__ Vedo che è diverso quindi foo. In realtà mi piacerebbe inserirlo in quel modulo e non in foo. Devo scrivere setattr (generatoClass .__ module__, generateClass .__ name__, generateClass) in questo caso? – mnowotka