2012-11-29 9 views
8

Mam moduł foo, wewnątrz tego modułu dynamicznie utworzona klasa:python jak zarejestrować dynamiczne klasy w module

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

Teraz, co chcę osiągnąć jest, aby ta nowa klasa dynamiczna widoczny jako klasa ten moduł:

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

Czy wiesz, jak to zrobić?

+0

gramatyka nazi wszędzie;) – mnowotka

+1

Składnia nazi! :-P –

Odpowiedz

13

Możesz użyć Bar = superClassCreator() w foo (na poziomie modułu).

Alternatywnie, z innego modułu, można dodać Bar jako atrybut na foo:

import foo 

foo.Bar = superClassCreator() 

lub, jeśli nazwa musi być pobrana z wygenerowanym Klasa:

import foo 

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

Od obrębie Moduł foo, można ustawić bezpośrednio na globals():

generatedClass = superClassCreator() 
globals()[generatedClass.__name__] = generatedClass 
del generatedClass 

z opcjonalną instrukcją del umożliwiającą ponowne usunięcie nazwy generatedClass z obszaru nazw.

+0

Na poziomie globalnym. –

+0

Co zrobić, jeśli nazwa jest generowana dynamicznie? Nie możesz tego zrobić w takim przypadku. – mnowotka

+0

Kiedy drukuję generatedClass .__ moduł__ Widzę, że jest inny niż foo. Właściwie chciałbym umieścić go w tym module, a nie w foo. Czy w takim przypadku powinienem napisać setattr (generatedClass .__ module__, generatedClass .__ name__, generatedClass)? – mnowotka

Powiązane problemy