[Python-Dev] Classes and Metaclasses in Smalltalk

Tim Peters tim.one@home.com
Thu, 3 May 2001 01:49:04 -0400


[MAL, on basemethods]
> ...
> In other words: you let Python continue the search for the method
> as if it hadn't found the occurrance calling the bsaemethod()
> API. Hmm, still not clear enough... better let Tim jump in here
> (we've had a discussion about basemethod() some months or years
> ago). Tim ?

Sorry, I'm not sure what either of you is talking about.  In

class A(B, C):
    def foo(self):
        super.foo()

Guido said that super would start searching at B, but I don't know what your
"continue the search for the method as if it hadn't found the occurrance
calling the bsaemethod() API" means:  defining what a thing does in terms of
an unspecified API it doesn't use is a pretty sure recipe for compounded
confusion <wink>.

Given that we're using Python's search rules, the ambiguous point remaining
is whether:

    super.f()

textually contained in a method of class K begins searching with:

    1) K.__bases__

or with:

    2) self.__class__.__bases__

Java uses #1, and Guido's "the search starts with B" implies that he would
too.  But it's unclear whether he meant that.  Given also

class D(A):
    def foo(self):
        super.foo()

D().foo()

both views agree that D.foo() is invoked first, and that D.foo() invokes
A.foo() next.  But under #1 A.foo() invokes C.foo() or D.foo() next, while
under #2 A.foo() invokes A.foo() again.  Multiple inheritance is a red
herring here -- take C out of A's bases, and the same ambiguity needs to be
resolved.