Alexandru Mosoi wrote: > On Sep 5, 11:47 am, Peter Otten <[EMAIL PROTECTED]> wrote: >> Alexandru Moșoi wrote: >> > i'm facing the following problem: >> >> > class Base(object): >> > def __getattr__(self, attr): return lambda x: attr + '_' + x >> >> > def dec(callable): >> > return lambda *args: 'dec_' + callable(*args) >> >> > class Derived(Base): >> > what_so_ever = dec(Base.what_so_ever) # wrong, base doesn't have >> > what_so_ever >> > mumu = dec(Base.mumu) # wrong, base >> > doesn't have mumu >> >> > any idea how to do this? >> >> __getattr__() is defined in the class to create instance attributes on >> the fly. If you want class attributes you have to put the __getattr__() >> method into the class of the class, or "metaclass": >> >> class Base(object): >> class __metaclass__(type): >> def __getattr__(self, attr): >> return lambda self, x: attr + '_' + x >> >> def dec(callable): >> return lambda *args: 'dec_' + callable(*args) >> >> class Derived(Base): >> what_so_ever = dec(Base.what_so_ever) >> >> d = Derived() >> print d.what_so_ever("42") >> >> I don't see how you can turn this into something useful... >> >> Peter > > 10x. it works. however I have another small problem. now, > d.third('blah') doesn't work because instance d doesn't have 'third' > attribute. I was expecting derived class to inherit the metaclass as > well, but it didn't.
That has nothing to do with inheritance: >>> type(Derived) <class 'classattr.__metaclass__'> If Python doesn't find an attribute in the instance it looks it up in the class but not in the metaclass: >>> Base.third <function <lambda> at 0x2b5f8028aa28> >>> Base().third Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Base' object has no attribute 'third' I think you should go back to the drawing board now and look for a simpler approach to solve your actual problem... Peter -- http://mail.python.org/mailman/listinfo/python-list