Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:abstract_base_class
  • Eine Base-Class ist eine Klasse aus der eine andere Klasse abgeleitet ist
  • eine Abstract Base Class ist das was in anderen Programmiersprachen ein Interface ist
    • eine Klasse die Methoden und Attribute definiert, sie aber nicht implementiert
    • statt dessen müssen die erbenden Klassen diese implementieren

Es gibt mehrere Wege eine solche Klasse zu implementieren:

  • abc-Bibliothek die Teil der Python-Standard-Bibliothek ist
    • das ist der einfachste Weg
  • über eine eigene Meta-Klasse

Über eine Metaklasse

  • Metaklassen sind Klassen die andere Klassen erschaffen (also im Gegensatz zu normalen Klassen die Objekte erschaffen)
  • jede Klasse kann eine Base-Class (von der sie erbt) und eine Metaklasse (die sie erschafft) haben
    • eine Metaklasse ist sozusagen eine Factory für Klassen
  • eine Metaklasse wird auch aufgerufen wenn eine isinstance- oder issubclass-Methoden aufegrufen werden
    • in diesen Fällen werden die Methoden __instancecheck__ oder __subclasscheck__ aufgerufen
    • durch überschreiben der Methoden kann man prüfen ob eine Klasse das entsprechende Interface implementiert hat

Über abc

  • Python bringt in der Standardbibliothek das Package abc (Abstract Base Class) mit
  • macht es etwas einfacher als über Metaklassen
    • genaugenommen stellt abc eine Metaklasse
  • Klassen die das Interface definieren haben als Metaklasse abc.ABCMeta
  • Methoden die als abstrakte Methode definiert werden, benutzen einen der folgenden Dekoratoren
    • @abc.abstractmethod
    • @abc.abstractclassmethod
    • @abc.abstractstaticmethod
  • Properties die abstrakt sind werden mit dem @property- und anschließend mit dem @abc.abstractmethod
  • die Prüfung ob eine Klasse ein Interface implementiert erfolgt erst bei der Instanzierung der Klasse
    • es gibt ggf. einen Type-Error wenn Methoden nicht implementiert wurden
  • Ob eine Methode die implementiert wird dann auch die gleichen Parameter implementiert wird nicht geprüft - einen Hinweis gibt es maximal durch die IDE

import abc

class MyMixedClass(metaclass=abc.ABCMeta):

    def ausgabe(self):
        print("Hallo aus MyMixdClass")

    @abc.abstractmethod
    def blubber(self, name):
        pass


class MyImplementation(MyMixedClass):

    def blubber(self, name):
        print(f"Grüße aus Bubbler {name}")

  • MyMixedClass definiert das Interface + (in diesem Fall) eine konkrete Methode
    • damit es abstrakte Methoden oder abstrakte Attribute definieren kann
  • MyImplementation erbt von
python/abstract_base_class.txt · Zuletzt geändert: 2020/10/27 13:49 von root