2010-10-12 9 views
19

Potrzebuję dynamicznie tworzyć klasy. Aby przejść dalej, muszę dynamicznie utworzyć podklasę klasy formularza Django.Dynamicznie tworzenie klas - Python

Dynamicznie zamierzam utworzyć klasę na podstawie konfiguracji dostarczonej przez użytkownika.


np.

chcę klasę o nazwie CommentForm które powinny podklasą klasy Form

Klasa powinna mieć listę wybranych atrybutów

.... w tym przypadku

name = forms.CharField()

comment = forms.CharField (widget = forms.Textarea())


Wszelkie przydatnych wskazówek? :)

+0

"Muszę dynamicznie tworzyć zajęcia." Jest to tak rzadko potrzebne, że musisz podać ** wiele ** więcej informacji, aby to pytanie miało sens. –

Odpowiedz

32

Można utworzyć klasy w locie przez wywołanie type wbudowane odpowiednie argumenty, przechodząc wzdłuż, jak:

CommentForm = type("CommentForm", (Form,), { 
    'name': forms.CharField(), 
    ... 
}) 

Działa z klasami w nowym stylu. Nie jestem pewien, czy to też będzie działać z klasami w starym stylu.

+1

To będzie działać z klasami starego stylu, o ile nie są one jedynymi klasami podstawowymi. Np. możesz zrobić 'type (name, (OldStyleClass, object), attrib_dict)', ale nie 'type (name, (OldStyleClass,), attrib_dict)'. Jeśli chcesz, aby wynikowa klasa była staromodna, nadal możesz parametryzować tworzenie klasy, umieszczając ją w funkcji, np. W [tej odpowiedzi] (http://stackoverflow.com/questions/3915024/dynamically-creating-classes -python/3915110 # 3915110). – intuited

12

Klasy można definiować niemal wszędzie.

def newclass(val): 
    class C(object): 
    def __str__(self): 
     return str(val) 
    return C 

MyClass = newclass(5) 
m = MyClass() 
print str(m) 
+1

Może nie jest od razu oczywiste dla niektórych czytelników, że ta technika może być użyta do ustawienia klasy bazowej dla 'C'. Jest to przydatne, jeśli z jakiegoś powodu trzeba dynamicznie utworzyć klasę starego stylu. – intuited

+1

to nie działa, jeśli chcesz ustawić zmienną klasy – user178047