Robin Becker wrote: > what's the best way to spell an abstract base class so that > 0) base is B and A inherits from B > > 1) doing B() causes an exception > > 2) most of the initialisation code is common in B On further reflection, the key thing is that an abstract class has one or more methods that *must* be overridden. So you can explicitly cripple those methods: >>> class B: ... "Abstract base class: subclasses must define method blah" ... def __init__(self): ... # ... ... pass ... def blah(self): ... raise "B.blah must be overridden" ... >>> class A(B): ... def blah(self): ... print 'A.blah' ... >>> B().blah() Traceback (innermost last): File "<stdin>", line 1, in ? File "<stdin>", line 7, in blah B.blah must be overridden >>> A().blah() A.blah Or implicitly crippling abstract methods by not defining them in the base class: >>> class B: ... "Abstract base class: subclasses must define method blah" ... pass ... >>> B().blah() Traceback (innermost last): File "<stdin>", line 1, in ? AttributeError: blah This also works if the base class is abstract with respect to attributes: >>> class B: ... "subclasses must define attribute KNOWN_KEYS" ... def __init__(self): ... self.keys = {} ... for k in self.KNOWN_KEYS: self.keys[k] = None ... >>> B() Traceback (innermost last): File "<stdin>", line 1, in ? File "<stdin>", line 5, in __init__ AttributeError: KNOWN_KEYS >>> class A(B): ... KNOWN_KEYS = ('one', 'two', 'three') ... >>> A() <__main__.A instance at 8070e20> >>> Personally, I would not bother enforcing abstractness explicitly. The base class documentation should say "abstract"; either people follow the documentation in order to make a correct subclass, or their code breaks and they then read the documentation! -Steve -- Steve Purcell, Pythangelist Get testing at http://pyunit.sourceforge.net/ Any opinions expressed herein are my own and not necessarily those of Yahoo
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4