Type casting a base class to a derived one?

Cliff Wells cliff at develix.com
Wed Jan 24 13:42:24 EST 2007


On Thu, 2007-01-11 at 08:41 -0600, Chris Mellon wrote:
> On 11 Jan 2007 15:01:48 +0100, Neil Cerutti <horpner at yahoo.com> wrote:
> > On 2007-01-11, Frederic Rentsch <anthra.norell at vtxmail.ch> wrote:
> > > If I derive a class from another one because I need a few extra
> > > features, is there a way to promote the base class to the
> > > derived one without having to make copies of all attributes?
> > >
> > > class Derived (Base):
> > >    def __init__ (self, base_object):
> > >       # ( copy all attributes )
> > >       ...
> > >
> > > This looks expensive. Moreover __init__ () may not be available
> > > if it needs to to something else.
> > >
> > > Thanks for suggestions
> >
> > How does it make sense to cast a base to a derived in your
> > application?
> >
> 
> I can't figure out any circumstance when you'd need to do this in
> Python. Upcasting like this is something you do in statically typed
> languages. I suspect that the OP doesn't really believe dynamic
> casting works and doesn't want to pass a derived class for some
> reason.

I actually encountered a need to do so (and I recalled seeing this
thread which is why I'm replying to it now).  I've got a dispatch system
based on object type.  Objects come from an external source (an ORM), so
I can't efficiently set their types at the point of creation (nor would
I necessarily want to).  However, in different contexts, I may want them
to be dispatched differently (i.e as if they are a different type).  In
fact, often the same object will be handled differently within two or
more contexts during the lifetime of that object.  It would be nice to
be able to cast them to a derived class (which actually adds no new
methods or attributes, just changes the type) at that exact moment to
cause the dispatcher to handle them differently.

Now, that being said, it's quite possible the system *could* have been
designed to not dispatch based on type, but quite frankly it works quite
elegantly and naturally for everything but this one case.

Just pointing out that just because we don't see a need for something
doesn't invalidate it.  It just makes it something we had thought of ;-)
  

Regards,
Cliff






More information about the Python-list mailing list