2010-10-12 54 views
19

Necesito crear dinámicamente una clase. Para ir más allá, necesito crear dinámicamente una subclase de la clase Form de Django.Creación dinámica de clases - Python

Dinámicamente tengo la intención de crear una clase basada en la configuración proporcionada por un usuario.


e.g.

quiero una clase llamado CommentForm que debe subclase de la clase Form

La clase debe tener una lista de atributos seleccionados

.... en este caso

name = forms.CharField()

comentario = forms.CharField (Widget = forms.Textarea())


Cualquier información útil? :)

+0

"Necesito crear dinámicamente una clase." Rara vez es necesario que tenga que proporcionar ** lotes ** más información para que esta pregunta tenga sentido. –

Respuesta

32

Puede crear clases sobre la marcha llamando a los type, pasando los argumentos adecuados incorporados a lo largo de, como:

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

Funciona con las clases de nuevo estilo. No estoy seguro de si esto también funcionaría con las clases de estilo antiguo.

+1

Esto funcionará con clases antiguas siempre que no sean las únicas clases base. Por ejemplo, puedes hacer 'type (name, (OldStyleClass, object), attrib_dict)' pero no 'type (name, (OldStyleClass,), attrib_dict)'. Si necesita que la clase resultante sea de estilo antiguo, aún puede parametrizar la creación de clases poniéndola en una función, como en [esta respuesta] (http://stackoverflow.com/questions/3915024/dynamically-creating-classes -python/3915110 # 3915110). – intuited

12

Las clases se pueden definir casi en cualquier lugar.

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

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

Quizás no sea inmediatamente obvio para algunos lectores que esta técnica se puede usar para establecer la clase base para 'C'. Esto es útil si necesita crear dinámicamente una clase de estilo antiguo por alguna razón. – intuited

+1

esto no funciona si desea establecer la variable de clase – user178047

Cuestiones relacionadas