2010-10-12 5 views
19

Je dois créer dynamiquement une classe. Pour aller plus loin, j'ai besoin de créer dynamiquement une sous-classe de la classe Form de Django.Création dynamique de classes - Python

Par dynamiquement, j'ai l'intention de créer une classe basée sur la configuration fournie par un utilisateur.


par exemple.

Je veux une classe nommée CommentForm qui devrait sous-classe de la classe Form

La classe doit avoir une liste d'attributs choisis

.... dans ce cas

nom = forms.CharField()

commentaire = forms.CharField (widget de = forms.Textarea())


Des conseils utiles? :)

+0

"Je dois créer dynamiquement une classe." Ceci est si rarement nécessaire que vous devez fournir un ** lot ** plus d'informations pour que cette question ait un sens. –

Répondre

32

Vous pouvez créer des classes à la volée en appelant les type intégrés, en passant le long des arguments appropriés, comme:

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

Il fonctionne avec des classes de type nouveau. Je ne suis pas sûr, si cela fonctionnerait aussi avec des classes à l'ancienne.

+1

Cela fonctionnera avec les classes de style ancien tant qu'elles ne sont pas les seules classes de base. Ainsi, par exemple vous pouvez faire 'type (nom, (OldStyleClass, objet), attrib_dict)' mais pas 'type (nom, (OldStyleClass,), attrib_dict)'. Si vous voulez que la classe résultante soit ancienne, vous pouvez toujours paramétrer la création de classe en la mettant dans une fonction, comme dans [cette réponse] (http://stackoverflow.com/questions/3915024/dynamically-creating-classes -python/3915110 # 3915110). – intuited

12

Les classes peuvent être définies presque n'importe où.

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

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

Il n'est peut-être pas évident pour certains lecteurs que cette technique peut être utilisée pour définir la classe de base de 'C'. Ceci est utile si vous avez besoin de créer dynamiquement une classe ancienne pour une raison quelconque. – intuited

+1

cela ne fonctionne pas si vous voulez définir la variable de classe – user178047