2

What's a good way to implement something similar to a Delphi/C# interface or abstract class in Python? A class that will force all its subclasses to implement a particular set of methods?

Cœur
  • 37,241
  • 25
  • 195
  • 267
Vector
  • 10,879
  • 12
  • 61
  • 101

1 Answers1

5

The simplest way to do this is to use the abstract base class implementation that has been included in Python since version 2.7.

This lets you mark a base class as abstract by using the abc.ABCMeta metaclass. You may then mark methods and properties as abstract. When you instantiate a class with the ABCMeta metaclass (or any of its subclasses) an exception will be thrown if any abstract properties or methods remain undefined in the instance.

e.g.

>>> from abc import ABCMeta, abstractmethod
>>> class Foo(object):
    __metaclass__ = ABCMeta
    @abstractmethod
    def bar(self): pass


>>> class BadFoo(Foo):
    pass

>>> BadFoo()

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    BadFoo()
TypeError: Can't instantiate abstract class BadFoo with abstract methods bar
>>> class GoodFoo(Foo):
    def bar(self):
        return 42


>>> GoodFoo()
<__main__.GoodFoo object at 0x027354B0>
>>> 

The check is done only when the class is instantiated because it is perfectly legitimate to have a subclass that only implements some of the abstract methods and is therefore itself an abstract class.

Duncan
  • 92,073
  • 11
  • 122
  • 156