Using metaclassed to dynamically generate a class based on a parameter to the objects init function.

Bruno Desthuilliers onurb at xiludom.gro
Fri Jun 23 09:26:54 EDT 2006


sashang at gmail.com wrote:
> Bruno Desthuilliers wrote:
> 
>>sashang at gmail.com wrote:
>>
>>>Hi
>>>
>>>I'd like to use metaclasses to dynamically generate a class based on a
>>>parameter to the objects init function.
>>
>>Do you really need a metaclass for this ?
>>
>>
>>>For example:
>>>
>>>class MetaThing(type):
>>>    def __init__(cls, name, bases, dict, extra_information):
>>>        super(MetaThing, cls).__init__(name, bases, dict)
>>>        #setup the class based on the parameter extra_information
>>>
>>>class Thing:
>>>    __metaclass__ = MetaThing
>>>    def __init__(self, extra_information):
>>>         #Somehow pass extra_information to the MetaThing
>>>
>>>extra_information = 1
>>>t = Thing(extra_information)
>>
>>Why would you want a new *class* here ?
>>
>>
>>>The above sample won't work but I hope it demonstrates what I'm trying
>>>to do.
>>
>>Not enough, I'm afraid - unless it's just me being dumb. From what I see
>>here, you just can add the extra informations on the object in the
>>initializer. What's your *real* use case ?
>>
> 
> The extra_information is used in MetaThing to tell it what attributes
> to add to the class. For example:
> 
> class MetaThing(type):
>      def __init__(cls, name, bases, dict, extra_information):
>          super(MetaThing, cls).__init__(name, bases, dict)
>          #setup the class based on the parameter extra_information
>          setattr(cls, make_name(extra_information),
> make_object(extra_information))
> 
> Does that clarify things? I might have the wrong approach

There's at least something wrong here : the metaclass code is executed
when the class statement (the one for a class having this metaclass) is
eval'd. It won't be called on class instanciation.

http://www.python.org/download/releases/2.2.3/descrintro/#__new__

Also, you need to understand that modifying a class with impact all it's
instances.

> - I'm new to
> metaclasses. However I do think the solution to my problem lies with
> them since I have to dynamically generate a class

You don't have to create classes for this - it's perfectly legal to set
attributes (data or methods) on a per-object basis. Classes are more
object-factories than rigid types. Just add the needed extra attributes
in the __init__ (the class one, not the metaclass) and you should be done.

>  and metaclasses
> provide a mechanism for doing this.

Metaclasses provides a hook on class creation process. But AFAICT, you
don't necessarily need metaclasses to dynamically create classes...




-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list