LU11b - Abstrakte Klassen in Python

Standardmässig stellt Python keine abstrakten Klassen bereit.  Das Modul abc stellt die Basis für die Definition von Abstract Base Classes ABC bereitstellt.  ABC funktioniert, indem Methoden der Basisklasse als “abstrakt dekoriert” und dann konkrete Klassen als Implementierungen der abstrakten Basis registriert werden.  Eine Methode wird abstrakt, wenn sie mit dem Schlüsselwort @abstractmethod dekoriert wird. Zum Beispiel so:

Beispiel: Abstrakte Klasse für Vielecke (Polygon)

from abc import ABC, abstractmethod  
 
class Polygon(ABC):  
    """
    Ein unbestimmtes Polygon, das
    a) weiss, dass es eine gewisse Anzahl Seiten hat
    b) aber nicht weiss, wie viele es wirklich sind.
    """
 
    def __init__(self):
        """
        Konstruktor: Könnte auch weggelassen werden, solange keine Attribute gesetzt werden.
        """
        pass
 
 
    @abstractmethod  
    def my_sides(self): 
        """
        Abstrakte Methode ohne Implementierung. Diese muss
        zwingend in einer abgeleiteten Klasse erfolgen.
        """
        pass  
 
class Triangle(Polygon):  
    # overriding abstract method  
    def my_sides(self):  
        print('I have 3 sides')  
 
class Quadrilateral(Polygon):  
    # overriding abstract method  
    def my_sides(self):  
        print('I have 4 sides')  
 
 
if __name__ == '__main__':  
    polygons = [  
        Triangle(),  
        Quadrilateral(),   
    ]  
    for p in polygons:  
        p.my_sides()

Output:

I have 3 sides
I have 4 sides

Beachten Sie hier die Nutzung der Polymorphie, um gleichartige Objekte (Triangle, Quadrilateral) gleich zu behandeln - konkret durch den Aufruf der (überschriebenen) Methode my_sides.


© Danie Fahrni, René Probst bearbeitet durch Marcel Suter