[Python-Dev] Simpler reformulation of C inheritance Q.
Guido van Rossum
Mon, 05 Aug 2002 10:08:04 -0400
> > I would like to create types with overridable methods.
> > This is supported by the new type system.
> > But I'd also like to make this as fast as possible and
> > therefore to avoid extra dictionary lookups for methods,
> > especially if they are most likely not overridden.
> > This would mean to create an extra meta type which creates
> > types with a couple of extra slots, for caching overridden
> > methods.
> > My problem is now that type objects are already variable
> > sized and cannot support slots in the metatype.
> > Is there a workaround on the boilerplate, or is there
> > interest in a solution?
> > Any suggestion how to implement it?
> I believe this is roughly the same thing I was bugging Guido about
> just before Python-dev. I wanted types which acted like new-style
> classes, but with room for an 'C' int to store some extra
> information -- namely, whether there were multiple 'C' extension
> classes being used as bases. IIRC the verdict was, "you can't do
> that today, but there should be a way to do it". Also if I remember
> anything about my hasty analysis at the time, the biggest challenge
> would be getting code which accesses types to rely on their
> tp_basicsize in order to find the beginning of the variable stuff.
Yes, we need a solution for this, but I still haven't figured out how
to do it. Help (best in the form of a suggested strategy) would be
>From Christian's post I can't tell if he wants his types to be dynamic
or static (i.e. if he's creating an arbitrary number of them at
run-time or only a fixed number that's known at compile-time).
Here's a hack.
For static extensions, you could extend one of the extension structs,
e.g. PyMappingMethods (which is the smallest and also least likely to
grow new methods), with additional fields. Then you'd have to know
whether you can access those extra fields; I suggest checking for the
metatype. A few casts and you're done.
For dynamic extensions, you might be able to do the same: after
type_new() has given you an object, allocate memory for an extended
PyMappingMethods struct, copy the existing PyMappingMethods struct
into it (if it exists), and replace the pointer. Then in your
deallocation function, make sure to free the pointer.
Hope this helps in the short run.
--Guido van Rossum (home page: http://www.python.org/~guido/)