2010-10-12 3 views
19

Мне нужно динамически создавать класс. Чтобы идти дальше, мне нужно динамически создать подкласс класса формы Django.Динамически создаваемые классы - Python

Динамически я намерен создать класс на основе конфигурации, предоставляемой пользователем.


e.g.

Я хочу класс с именем CommentForm, который должен подкласс класса формы

Класс должен иметь список выбранных атрибутов

.... в этом случае

name = forms.CharField()

комментарий = forms.CharField (виджет = forms.Textarea())


Любые полезные советы? :)

+0

«Мне нужно динамически создавать класс». Это настолько редко необходимо, что вам нужно предоставить ** много ** больше информации, чтобы этот вопрос имел смысл. –

ответ

32

Вы можете создавать классы на лету, вызывая type встроенные, проходящие соответствующие аргументы вместе, как:

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

Он работает с классами нового стиля. Я не уверен, будет ли это работать и с классами старого стиля.

+1

Это будет работать со старыми классами, если они не являются единственным базовым классом. Так, например, вы можете сделать 'type (name, (OldStyleClass, object), attrib_dict)', но не 'type (name, (OldStyleClass,), attrib_dict)'. Если вам нужно, чтобы полученный класс был в старом стиле, вы все же можете параметризовать создание класса, поместив его в функцию, как в [этот ответ] (http://stackoverflow.com/questions/3915024/dynamically-creating-classes -python/3915110 # 3915110). – intuited

12

Занятия могут быть определены практически в любом месте.

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

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

Для некоторых читателей, возможно, не сразу видно, что этот метод можно использовать для установки базового класса для 'C'. Это полезно, если вам почему-то нужно динамически создавать класс старого стиля. – intuited

+1

это не работает, если вы хотите установить переменную класса – user178047

Смежные вопросы