[Python-3000] Breakthrough in thinking about ABCs (PEPs 3119 and 3141)

Joel Bender jjb5 at cornell.edu
Tue May 1 18:16:08 CEST 2007


Phillip J. Eby wrote:

>> Personally, I still think that the most uniform way of spelling this
>> is overloading isinstance and issubclass; that has the highest
>> likelihood of standardizing the spelling for such inquiries.
> 
> A big +1 here.  This is no different than e.g. operator.mul() being able to 
> do different things depending on the second argument.

n00b here, trying to follow this...

     class X:
         def __mul__(self, y): print self, "mul", y
         def __rmul__(self, y): print self, "rmul", y

Treating isinstance like operator.mul, I could do this (and I would 
expect that you want to make it a class method)...

     class Y:
         @classmethod
         def __risinstance__(cls, obj): print obj, "is instance of", cls

So issubclass(D, C) would call D.__issubclass__(C) or 
C.__rissubclass__(D) and leave it up to the programmer.  The former is 
"somebody is checking to see if I inherit some functionality" and the 
latter is "somebody is checking to see if something is a proper derived 
class of me".

     class A(object):
         @classmethod
         def __rissubclass__(cls, subcls):
             if not object.__rissubclass__(cls, subcls):
                 return False
             return subcls.f is not A.f

         def f(self):
             raise RuntimeError, "f must be overridden"

     class B(A):
         def g(self): print "B.g"

     class C(A):
         def f(self): print "C.f"

Now my testing can check issubclass(B, A) and it will fail because B.f 
hasn't been provided, but issubclass(C, A) passes.  I don't have to call 
B().f() and have it fail, it might be expensive to create a B().


Joel



More information about the Python-3000 mailing list