Create classes at runtnime

Peter Otten __peter__ at web.de
Sun Feb 6 07:31:16 EST 2011


Marc Aymerich wrote:

> On Feb 5, 1:06 pm, Marc Aymerich <glicer... at gmail.com> wrote:
>> Thank you all for the answers!
>>
>> I'll try to give you the context in which I need to generate classes
>> like this.
>>
>> I'm developing a reusable control panel for an ISP. I have several
>> modules (VirtualUser, SystemUser, VPS, VirtualHost, ...) and they all
>> share the fact that you can have limits on resource consumption. for
>> example.
>>
>> VPS: has limits on swap, memory, cpu and disk.
>> SystemUser: has limits on disk and traffic.
>>
>> As all modules share this property of being limited I have decided to
>> split the limit functionality in a separate module (called resources).
>> Resources are associated dinamically with (vps, systemuser ...)
>> through a Monitor class. So it's up to you decide what limits you are
>> interested to put in the VPS or in the SystemUser ...
>>
>> So when you attach the "disk limit" to SystemUser model is necessary
>> to create a web form for SystemUser a bit different than if you decide
>> to have disk and traffic limits. That is what my posted code is
>> supposed to do.
>>
>> Do you think that I am on the wrong way designing the control panel
>> like this?
>>
>> Btw, I've seen several interesting ideas to create the class
>> dinamically (with class factorys, MetaClass, dictionaries ..), but I
>> have not yet clear whether this will be usefull for create the
>> __init__ function at runtime too. Any clue on this?
>>
> 
> this seems to work :)
> 
> def makeLimitForm(name, monitors, _model):
> 
>     class Meta:
>         model = _model
>     dct = { 'Meta': Meta }
> 
>     for monitor in monitors:
>         field_name = monitor.resource + "_limit"
>         dct[field_name] = forms.CharField(max_length=100,
> initial=monitor.default_limit)
> 
>     def __init__(self, *args, **kwargs):
>         ModelForm.__init__(self, *args, **kwargs)
>         if 'instance' in kwargs:
>             for monitor in monitors:
>                 field_name = monitor.resource + "_limit"
>                 print monitor
>                 self.fields[field_name].initial =
> kwargs['instance'].monitoring.filter(monitor=monitor)[0].current
> 
>     dct['__init__'] = __init__
> 
>     return type(name,(ModelForm,),dct)

I've looked around to see whether Django offers an API for your usecase, but 
only found

http://code.djangoproject.com/wiki/DynamicModels

which seems to describe what you are already doing.



More information about the Python-list mailing list