[BangPypers] MetaClass in python
steve
steve at lonetwin.net
Thu Jan 13 06:08:46 CET 2011
On 01/12/2011 09:13 PM, Nitin Kumar wrote:
> Hi Taj,
>
> On Wed, Jan 12, 2011 at 3:43 PM, Sirtaj Singh Kang<sirtaj at sirtaj.net>wrote:
>
>>
>> On 11-Jan-11, at 8:47 PM, Nitin Kumar wrote:
>> [snip]
>>
>> So i do know who to create a class and its function dynamically at
>>> runtime???
>>>
>>
>> You can dynamically create a class like this:
>>
>> NewClass = type('NewClass', (object,), {})
>>
>> where 'NewClass' is the name of your class, (object,) is any tuple of
>> superclasses and *{} will be the __dict__ of the new class*. As steve
>> mentioned earlier, you can
>
>
> So {} can contain function also for the new class, if then can you give
> example for the same. As i need function to class being generated.
>
Namespaces in python are basically dicts ...
[steve at laptop ~]$ python
Python 2.7 (r27:82500, Sep 16 2010, 18:02:00)
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> class A:
... def m(self):
... pass
...
>>> A.__dict__
{'__module__': '__main__', 'm': <function m at 0x7f08629af398>, '__doc__': None}
>>> a = A()
>>> dir(a) # the keys of __dict__ of the `object`
['__doc__', '__module__', 'm']
>>> dir(A) # the keys of __dict__ of the `class`
['__doc__', '__module__', 'm']
>>>
So, if you want to create a new function and replace it, use the method I showed
earlier, or if you really need to create a new class you can use the approach
that taj showed, basically something like this:
>>> class foo(object):
... pass
...
>>> def method(obj, arg):
... print "do something with %s passing arg %s" % (obj, arg)
...
>>> NewClass = type('NewClass', (foo,), {'callme' : method})
>>> a = NewClass()
>>> a.callme("argument to a")
do something with <__main__.NewClass object at 0x7f08629aa610> passing arg
argument to a
>>>
I haven't yet looked at the unittest example that you gave because to be honest,
I'm sorry, I didn't quite understand what you said on first reading.
I'll take a closer look sometime today and reply if possible, however, basically
all that your really need to understand is a `metaclass` is basically something
that creates a new object (which is a class) with a nicely customized dict. That
is to say ...
# if ...
A = MetaClass()
# you have the ability to say ...
a = A()
# and also say ...
a.some_method()
# because MetaClass created A.__dict__ to contain ...
{'some_method':<function some_method>, ...}
cheers,
- steve
--
random spiel: http://lonetwin.net/
what i'm stumbling into: http://lonetwin.stumbleupon.com/
More information about the BangPypers
mailing list