logo

Abstrakte Klassen in Python

Eine abstrakte Klasse kann als Blaupause für andere betrachtet werden Klassen . Sie können damit eine Reihe von Methoden erstellen, die in allen aus der abstrakten Klasse erstellten untergeordneten Klassen erstellt werden müssen.

Eine Klasse, die eine oder mehrere abstrakte Methoden enthält, wird als an bezeichnet abstrakte Klasse . Ein abstrakte Methode ist eine Methode, die eine Deklaration, aber keine Implementierung hat.

Wir verwenden eine abstrakte Klasse, wenn wir große Funktionseinheiten entwerfen oder wenn wir eine gemeinsame Schnittstelle für verschiedene Implementierungen einer Komponente bereitstellen möchten.



Abstrakte Basisklassen in Python

Durch die Definition einer abstrakten Basisklasse können Sie eine gemeinsame Klasse definieren Anwendungsprogrammschnittstelle (API) für eine Menge von Unterklassen. Diese Funktion ist besonders nützlich in Situationen, in denen ein Dritter Implementierungen bereitstellt, z. B. mit Plugins, kann Ihnen aber auch bei der Arbeit in einem großen Team oder mit einer großen Codebasis helfen, bei der es schwierig oder nicht schwierig ist, alle Klassen im Kopf zu behalten möglich.

Arbeiten an Python Abstract-Klassen

Standardmäßig, Python bietet keine abstrakte Klassen . Python verfügt über ein Modul, das die Basis für die Definition von A bietet bstract Basisklassen (ABC) und dieser Modulname ist ABC .

ABC funktioniert, indem es Methoden der Basisklasse als Zusammenfassung dekoriert und dann konkrete Klassen als Implementierungen der abstrakten Basis registriert. Eine Methode wird abstrakt, wenn sie mit dem Schlüsselwort @abstractmethod versehen wird.

Beispiel 1:

Dieser Code definiert eine abstrakte Basisklasse namens Polygon Verwendung des ABC-Moduls (Abstract Base Class) in Python. Die Polygon-Klasse verfügt über eine abstrakte Methode namens noofsides das muss von seinen Unterklassen implementiert werden.

Es sind vier Unterklassen von Polygonen definiert: Dreieck, Fünfeck, Sechseck und Viereck. Jede dieser Unterklassen überschreibt die Methode noofsides und stellt ihre eigene Implementierung bereit, indem sie die Anzahl ihrer Seiten ausgibt.

Im Treibercode werden Instanzen jeder Unterklasse erstellt und die Methode noofsides wird für jede Instanz aufgerufen, um die Anzahl der für diese Form spezifischen Seiten anzuzeigen.

Python
# Python program showing # abstract base class work from abc import ABC, abstractmethod class Polygon(ABC): @abstractmethod def noofsides(self): pass class Triangle(Polygon): # overriding abstract method def noofsides(self): print('I have 3 sides') class Pentagon(Polygon): # overriding abstract method def noofsides(self): print('I have 5 sides') class Hexagon(Polygon): # overriding abstract method def noofsides(self): print('I have 6 sides') class Quadrilateral(Polygon): # overriding abstract method def noofsides(self): print('I have 4 sides') # Driver code R = Triangle() R.noofsides() K = Quadrilateral() K.noofsides() R = Pentagon() R.noofsides() K = Hexagon() K.noofsides()>

Ausgabe
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>

Beispiel 2:

Konvertieren Sie einen String in int in Java

Hier definiert dieser Code eine abstrakte Basisklasse namens Animal unter Verwendung des ABC-Moduls (Abstract Base Class) in Python. Die Animal-Klasse verfügt über eine nicht abstrakte Methode namens move, die über keine Implementierung verfügt. Es gibt vier Unterklassen von Tieren: Mensch, Schlange, Hund und Löwe. Jede dieser Unterklassen überschreibt die Move-Methode und stellt ihre eigene Implementierung bereit, indem sie ein bestimmtes Bewegungsmerkmal ausgibt.

Python
# Python program showing # abstract base class work from abc import ABC, abstractmethod class Animal(ABC): def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') # Driver code R = Human() R.move() K = Snake() K.move() R = Dog() R.move() K = Lion() K.move()>

Ausgabe
I can walk and run I can crawl I can bark I can roar>

Implementierung von Abstract durch Unterklasse

Indem wir Unterklassen direkt von der Basis bilden, können wir die Notwendigkeit vermeiden, die Klasse explizit zu registrieren. In diesem Fall wird zur Erkennung die Python-Klassenverwaltung verwendet Plugin-Implementierung als Umsetzung der abstrakte PluginBase .

Python
# Python program showing # implementation of abstract # class through subclassing import abc class parent: def geeks(self): pass class child(parent): def geeks(self): print('child class') # Driver code print( issubclass(child, parent)) print( isinstance(child(), parent))>

Ausgabe
True True>

Ein Nebeneffekt der Verwendung direkter Unterklassen besteht darin, dass Sie alle Implementierungen Ihres Plugins finden können, indem Sie die Basisklasse nach der Liste der davon abgeleiteten bekannten Klassen fragen.

Konkrete Methoden in abstrakten Basisklassen

Konkrete Klassen enthalten nur konkrete (normale) Methoden, wohingegen abstrakte Klassen sowohl konkrete als auch abstrakte Methoden enthalten können.

Die konkrete Klasse stellt eine Implementierung abstrakter Methoden bereit, die abstrakte Basisklasse kann auch eine Implementierung bereitstellen, indem sie die Methoden über super() aufruft. Schauen wir uns das Beispiel an, um die Methode mit super() aufzurufen:

Python
# Python program invoking a  # method using super() from abc import ABC class R(ABC): def rk(self): print('Abstract Base Class') class K(R): def rk(self): super().rk() print('subclass ') # Driver code r = K() r.rk()>

Ausgabe
Abstract Base Class subclass>

Im obigen Programm können wir die Methoden in abstrakten Klassen aufrufen, indem wir verwenden super().

Abstrakte Eigenschaften in Python

Abstrakte Klassen enthalten neben Methoden auch Attribute. Sie können die Attribute in konkreten Klassen anfordern, indem Sie sie mit @abstractproperty definieren.

Python
# Python program showing # abstract properties import abc from abc import ABC, abstractmethod class parent(ABC): @abc.abstractproperty def geeks(self): return 'parent class' class child(parent): @property def geeks(self): return 'child class' try: r = parent() print(r.geeks) except Exception as err: print(err) r = child() print(r.geeks)>

Ausgabe
Can't instantiate abstract class parent with abstract methods geeks child class>

Im obigen Beispiel kann die Basisklasse nicht instanziiert werden, da sie nur über eine abstrakte Version der Property-Getter-Methode verfügt.

Instanziierung abstrakter Klassen

Abstrakte Klassen sind unvollständig, weil sie Methoden haben, die niemand haben. Wenn Python das Erstellen eines Objekts für abstrakte Klassen zulässt, kann dieses Objekt verwendet werden, wenn jemand die abstrakte Methode aufruft, aber keine tatsächliche Implementierung zum Aufrufen vorhanden ist.

Wir verwenden also eine abstrakte Klasse als Vorlage und erweitern sie je nach Bedarf und bauen darauf auf, bevor wir sie verwenden können. Da eine abstrakte Klasse keine konkrete Klasse ist, kann sie nicht instanziiert werden. Wenn wir ein Objekt für die abstrakte Klasse erstellen, ist es löst einen Fehler aus .

Python
# Python program showing # abstract class cannot # be an instantiation from abc import ABC,abstractmethod class Animal(ABC): @abstractmethod def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') c=Animal()>

Ausgabe:

Traceback (most recent call last): File '/home/ffe4267d930f204512b7f501bb1bc489.py', line 19, in c=Animal() TypeError: Can't instantiate abstract class Animal with abstract methods move>