Hi,
I would like to create a Decorator metaclass, which automatically
turns a class which inherits from the "Decorator" type into a
decorator.
A decorator in this case, is simply a class which has all of its
decorator implementation inside a decorator() method. Every other
attribute access is being proxied to decorator().getParent().

Here's my attempt:
-------------------------------------------------------
from new import classobj

class DecoratorType(type):
        def __new__(cls, name, bases, dct):
                dct2 = {}
                for key, val in dct.iteritems():
                        dct2[key] = val

                # create a new class which will store all of the implementation
                impl = classobj('%sImpl'%name,(),dct2)

                # update the old class to implement this implementation
                def __init__(self, *args, **dargs):
                        object.__setattr__(self, '__impl', impl(*args, **dargs))
                def decorator(self):
                        return object.__getattribute__(self,'__impl')
                def __getattribute__(self, attr):
                        if attr=="decorator":
                                return object.__getattribute__(self,'decorator')
                        return getattr(object.__getattribute__(self, 
'decorator')
().getParent(), attr)
                dct = {}
                dct['__init__'] = __init__
                dct['decorator'] = decorator
                dct['__getattribute__'] = __getattribute__

                return type.__new__(cls, name, bases, dct)

class Decorator(object):
        __metaclass__ = DecoratorType

class HBar(Decorator):
        def __init__(self, number):
                Decorator.__init__(self)
                self._number = number
        def inc(self):
                self._number += 1
        def p(self):
                print self._number

hbar = HBar(10)
for each in dir(hbar.decorator()):
        print each

hbar.decorator().p()
hbar.decorator().inc()
hbar.decorator().p()
-------------------------------------------------------
Unfortunately this does not work. The newly defined __init__ method
inside __new__, does a call to impl(*args, **dargs). However, since
the HBar.__init__ calls the Decorator.__init__ method, but the
HBar.__init__ method no longer resides inside HBar, but rather inside
HBarImpl (which is no longer a subtype of Decorator), the compiler
complains that Decorator.__init__ is not being called with a Decorator
instance as its first argument (which is true).
I tried changing the definition of impl inside __new__ to have
Decorator as one of its bases, but then for some reason impl(*args,
**dargs) asks for 4 arguments (just like __new__) and I have no clue
as to why that happens.

Any help on this?

Regards,
Thomas K.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to