23

I need to dynamically create a class. To go in futher detail I need to dynamically create a subclass of Django's Form class.

By "dynamically" I intend to create a class based on configuration provided by a user.


e.g.

I want a class named CommentForm which should subclass the Form class.

The class should have a list of chosen attributes.

....in this case

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

Any useful tips? :)

1
  • 1
    "I need to dynamically create a class." This is so rarely needed that you have to provide a lot more information in order for this question to make sense. Commented Oct 12, 2010 at 14:55

2 Answers 2

37

You can create classes on the fly by calling the type built-in, passing appropriate arguments along, like:

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

It works with new-style classes. I am not sure, whether this would also work with old-style classes.

Sign up to request clarification or add additional context in comments.

1 Comment

This will work with old-style classes as long as they aren't the only base class(es). So e.g. you can do type(name, (OldStyleClass, object), attrib_dict) but not type(name, (OldStyleClass,), attrib_dict). If you need the resulting class to be old-style, you can still parametrize the class creation by putting it in a function, like in this answer.
14

Classes can be defined almost anywhere.

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

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

1 Comment

It's maybe not immediately obvious for some readers that this technique can be used to set the base class for C. This is useful if you need to dynamically create an old-style class for some reason.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.