[Python-Dev] type categories

Barry A. Warsaw barry@python.org
Fri, 13 Sep 2002 10:38:03 -0400

>>>>> "JH" == Jeremy Hylton <jeremy@alum.mit.edu> writes:

>>>>> "DA" == David Abrahams <dave@boost-consulting.com> writes:

    DA> I was going to say that is seems to me if you can dynamically
    DA> inject base classes in Python there's no problem using
    DA> inheritance to do this sort of labelling. However, on third
    DA> though, maybe there is a problem. Suppose you have an
    DA> inheritance chain A->B->C...->Z and I come a long later to say
    DA> that A fulfills interface II and add II to A's bases. Which of
    DA> A's subclasses also fulfill II. I might not know. I might not
    DA> even know about them. For this, maybe you'd need a way to
    DA> express inheritance that goes just "one level deep" (i.e. A
    DA> inherits II publicly, but nothing else does). And that might
    DA> just screw with the notion of inheritance enough that you want
    DA> a separate parallel mechanism.

    DA> So I guess I'm back to where I was before. Inheritance
    DA> probably doesn't work out too well for expressing "satisfies
    DA> interface".

    JH> I had similar third thoughts a couple of weeks ago :-).  So I
    JH> guess I agree with you.

I tend to agree as well.  But to play devil's advocate for a moment: I
think Guido said that inheritance won't be the only way to spell
conforms-to, but it'll be the predominately common way.  So you'd
definitely need a way to spell that outside of inheritance as your
example clearly shows.  Which means that any conformsto() function
will have to be more complicated because it'll need to check both
mechanisms.  Is that a worthwhile price to pay to allow

What I don't like about the inheritance mechanism is that the syntax
isn't explicit.  I look at a class definition and I don't really know
what's a base class for implementation purposes and what's an
interface assertion.  It might even be difficult if I had the source
code for all the classes in the base class list if there's little
except convention to syntactically distinguish between a class
definition and an interface definition (no keyword, but just a
stylized bunch of defs).  I think it's going to be important to know
what's an interface and what's a base class.  Naming conventions
(IThingie) can help but aren't enforced.