Abstract class
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Sun Sep 14 16:25:18 EDT 2008
On Sun, 14 Sep 2008 12:15:04 -0700, Gary Herron wrote:
> (If you wish to consider the base class "abstract", just agree with
> yourself to not instantiate it.)
That's certainly the most lightweight option.
> Please forget about Abstract Base Classes. They have nothing to do with
> what you want, and are a *HUGE* overkill for your application. They
> are not (yet) even part of standard Python, and are used primarily for a
> class implementor to guarantee to a user of a class that it provides a
> specific interface.
You can implement a lightweight abstract base class in Python fairly
easily, by adding two lines to the __init__ method of your base class.
class Base(object):
def __init__(self):
if self.__class__ is Base:
raise NotImplementedError("Abstract base class")
def method(self, *args):
return len(args) # or something useful
If you want to get fancy, you can define a custom exception instead of
using NotImplementedError. And that's about all you need. You can get
more complicated if you want, but why bother?
If I may be excused a slight digression, I don't get the "abstract" part
of ABCs. The prohibition against instantiating them just seems very
artificial, I don't see what benefit it gets you. Wikipedia says:
"The fact that many languages disallow instantiation of abstract types
(and force subtypes to implement all needed functionality) further
ensures program correctness."
http://en.wikipedia.org/wiki/Abstract_base_class
but I don't see how that follows (except possibly in very special cases).
Given that the set of instances of class B is empty, how does that help
you know that B.method is correct?
--
Steven
More information about the Python-list
mailing list