Creating new types and invoking super
Guilherme Polo
ggpolo at gmail.com
Wed Jan 23 17:42:02 EST 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