Voluntary Abstract Base Classes

James Stroud jstroud at mbi.ucla.edu
Fri Jun 29 14:08:00 EDT 2007


Daniel Nogradi wrote:
> Hi list,
> 
> Well, the short question is: what are they? I've read Guido's python
> 3000 status report on
> http://www.artima.com/weblogs/viewpost.jsp?thread=208549 where he
> mentions ABC's but don't quite understand what the whole story is
> about.
> 
> Anyone has good use cases?
> 
> Daniel

My interpretation of his description is that this is a way to check for 
quack likes a duck behavior.

Say I want a function to check if something behaves like a slice, but 
don't want to resort to checking for explicit inheritence, I might now 
have to do something like (factoring out the checking):


def is_slice_like(candidate):
   for att in 'start', 'stop', 'step', 'indices':
     if not hasattr(candidate, att):
       return False
   return True

def doit(anarg):
   if not is_slice_like(anarg):
     raise Exception, 'Must give something like a slice.'
   do_rest_of_it()


However, with an ABC, you could define what it means to be slice-like by 
defining a slice-like ABC (e.g. SliceLike) and then virtually inheriting 
from this ABC:


# assuming abstract inheritence syntax is the same as regular
class MySlice(SliceLike):
   # etc.

def doit(anarg):
   if not issubclass(anarg.__class__, SliceLike):
     raise Exception, 'Must give something SliceLike.'

def main():
   anarg = MySlice(1,2,3)
   doit(anarg)


With ABCs, the concept of slice-like is more formalized and transparent 
than the attribute checking done in is_slice_like and is far more 
flexible than explicit type checking.

The concept seems to be borrowed from Java interfaces.

But I'm ready to be corrected on my interpretation.

James



More information about the Python-list mailing list