[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