Abstract Base Classes

Colin J. Williams cjw at sympatico.ca
Fri Nov 11 09:55:06 EST 2005


Ben Finney wrote:
> Howdy all,
> 
> Okay, so Guido doesn't like Abstract Base Classes[0], and interfaces
> are the way of the future[1]. But they're not here now, and I
> understand ABCs better.
This is a very interesting discussion - not all of it understandable to me.

Are interfaces really in our future?

I found the contributions of "steffen" particularly appealing. 
Interfaces seem to add another level of complexity without significant 
benefit.

Colin W.
> 
> I want my modules to (sometimes) define an abstract base exception
> class, that all other exceptions in that module inherit from.
> 
>     class FooException(Exception):
>         """ Base class for all FooModule exceptions """
> 
>     class FooBadFilename(FooException):
>         """ Raised when a bad filename is used in a foo """
> 
>     class FooUnknownBar(FooException, KeyError):
>         """ Raised when an unknown bar is used with a foo """
> 
> However, there should never be an exception raised of class
> FooException, and in fact I want that to cause an appropriate error to
> be raised from the module.
> 
> Normally, I'd pick some key part of the functionality of the class,
> and cause that to raise NotImplementedError. It's then the
> responsibility of subclasses to override that.
> 
> However, in the case of exceptions, I don't want to override *any*
> functionality; everything should be provided by the base classes. It'd
> be messy to have to override something in every subclass just to
> ensure the abstraction of the module base exception.
> 
> I've tried doing this in the __init__():
> 
>     class FooException(Exception):
>         """ Base class for all FooModule exceptions """
>         def __init__(self):
>             raise NotImplementedError, \
>                 "%s is an abstract class for exceptions" % self.__class__
> 
> When I use this, I discovered to my horror that the subclasses were
> calling FooException.__init__ -- which I though wasn't supposed to
> happen in Python!
> 
> It's also rather semantically weird, to my eye.
> 
> Can I do something tricky with checking base classes in the
> FooException.__init__() ?
> 
> 
> [0] Although he's apparently been quoted earlier as saying he did.
> He's changed his mind[1] since then.
> 
> [1] <URL:http://www.artima.com/weblogs/viewpost.jsp?thread=92662>
> 



More information about the Python-list mailing list