On 01/12/2011 09:13 PM, Nitin Kumar wrote:
Hi Taj,

On Wed, Jan 12, 2011 at 3:43 PM, Sirtaj Singh Kang<sir...@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@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/
_______________________________________________
BangPypers mailing list
BangPypers@python.org
http://mail.python.org/mailman/listinfo/bangpypers

Reply via email to