* 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