Metaclass Question
Shalabh Chaturvedi
shalabh at cafepy.com
Wed Oct 6 23:42:41 EDT 2004
Jay Parlar wrote:
> I decided to finally bite the bullet, and become part of the 1% of
> people who understand metaclasses.
..snipped..
> My class here is close, but the problem is with my 'def new_func'. For
> some reason I assumed that "new instances" of it would get created for
> each method being overridden, but they're not.
..snipped..
> Is there any way to make new instances of a function, short of a lambda?
Although new functions are created every time you go over the def
statement in the loop, the func_name variable inside the function gets
bound to the same object at the end. The solution is to use another
function to produce fuctions. Wonder if I made any sense. I couldn't get
your code to do anything on my machine, though.
Anyways, here is a much simpler version which does the same thing:
---
def make_func(fname, func):
def new_func(self, *args, **kw):
self.current_function = fname
return func(self, *args, **kw)
return new_func
class MethodNameGetter(type):
def __init__(cls, name, bases, dict_):
super(MethodNameGetter, cls).__init__(name, bases, dict_)
funcs = [(fname,func) for fname,func in dict_.items() if
isinstance(func, FunctionType)]
for fname, func in funcs:
new_func = make_func(fname, func)
setattr(cls, fname, new_func)
setattr(cls, '_old_' + fname, func)
---
HTH,
Shalabh
More information about the Python-list
mailing list