Creating new types and invoking super

Guilherme Polo ggpolo at gmail.com
Wed Jan 23 23:42:02 CET 2008


2008/1/23, Guilherme Polo <ggpolo at gmail.com>:
> 2008/1/23, Arnaud Delobelle <arnodel at googlemail.com>:
> > On Jan 23, 8:55 pm, "Guilherme Polo" <ggp... at gmail.com> wrote:
> > > Hello,
> >
> > Hi
> > [...]
> > > First I tried this:
> > >
> > > def init(func):
> > >     def _init(inst):
> > >         super(inst.__class__, inst).__init__()
> > >         func(inst)
> > >
> > >     return _init
> > >
> > > class A(object):
> > >     @init
> > >     def __init__(self): pass
> >
> > This kind of approach can't work, you need to call super(A, obj).
> > super(type(obj), obj) is pointless, it defeats the whole purpose of
> > the mro!
> >
>
> Yeh, as shown in the next examples in the previous email. Using a
> decorator for that doesn't sound useful at all, was just trying
> something different ;) I will stick to the no-decorator option.
>
> > The only way I can think of would be to create a metaclass, but I
> > don't think it's worth it.  super(A, obj).__init__() isn't that bad!
> >
>
> Metaclass doesn't apply here because metaclass is related to
> class-construction. This is related to instance initialization, and
> I'm creating the types as the user asks.

Oops, actually it can be done. But I am not going to stick to it, just
did a sample here that "solves" for a not so deep structure:

def init(func):
    def _init(cls):
        if hasattr(cls, "myclass"):
            super(cls.myclass, cls).__init__()
        else:
            super(cls.__class__, cls).__init__()
        func(cls)

    return _init

class M(type):
    def __new__(cls, classname, bases, classdict):
        if not len(classdict):
            if 'myclass' in bases[0].__dict__:
                classdict['myclass'] = bases[0].__dict__['myclass']
            else:
                classdict['myclass'] = bases[0]


        return type.__new__(cls, classname, bases, classdict)

class Y(object):
    __metaclass__ = M

class X(Y):
    @init
    def __init__(self):
        print "X"

X()
y = type("Z", (X, ), {})
w = type("W", (y, ), {})
y()
w()

>
> > --
> > Arnaud
> >
> > --
> > http://mail.python.org/mailman/listinfo/python-list
> >
>
>
> --
> -- Guilherme H. Polo Goncalves
>


-- 
-- Guilherme H. Polo Goncalves



More information about the Python-list mailing list