spir wrote: > Hello, > > I have (again) some issue using __new__. > What I need is basically to catch an object creation and yield an object of > an alternate type, when a condition is met. > > Basically, the outline looks like: > > class Normal(object): > def __new__(cls, arg): > if cond(arg): > # <yield instance of Special> > # expression is simply: Special(arg) > # must be __init__ialised ! > > # Conceptually, nothing to change: > # <yield instance of Normal> > # must be __init__ialised ! > > But I got issues in both cases: > * cannot find how to get Special objects initialised > * cannot find how to return Normal object
roughly like this: >>> class Special(object): ... def __init__(self, arg): ... self.arg = arg ... >>> class Normal(object): ... def __new__(cls, arg): ... if arg: ... return Special(arg) ... else: ... ret = super(Normal, cls).__new__(cls) ... ret.__init__(arg) ... return ret ... def __init__(self, arg): ... self.arg = arg ... >>> a = Normal(True) >>> b = Normal(False) >>> a.arg True >>> b.arg False >>> generally though, avoid using __new__ > (also Normal's supertype has no explicite __new__, but it has an __init__) Haven't tested yet, but that should be no problem as python will use the supertype's supertype's __new__ and at the end of the method resolution order is object.__new__() _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor