Anwenden von Polymorphismus auf Klassen in Python 3

Einführung

Polymorphism ist die Fähigkeit, dieselbe Schnittstelle für verschiedene zugrunde liegende Formen wiedata types oderclasses zu nutzen. Dies ermöglichtfunctions, Entitäten unterschiedlichen Typs zu unterschiedlichen Zeiten zu verwenden.

Für die objektorientierte Programmierung in Python bedeutet dies, dass ein bestimmtes Objekt, das zu einer bestimmten Klasse gehört, auf dieselbe Weise verwendet werden kann, als wäre es ein anderes Objekt, das zu einer anderen Klasse gehört.

Der Polymorphismus ermöglicht Flexibilität und lose Kopplung, sodass der Code über einen längeren Zeitraum erweitert und problemlos beibehalten werden kann.

In diesem Lernprogramm wird Polymorphismus auf Klassen in Python angewendet.

Was ist Polymorphismus?

Polymorphismus ist eine wichtige Funktion der Klassendefinition in Python, die verwendet wird, wenn Sie Methoden in Klassen oder Unterklassen gemeinsam benannt haben. Auf diese Weise können Funktionen Objekte einer dieser polymorphen Klassen verwenden, ohne dass die Unterschiede zwischen den Klassen berücksichtigt werden müssen.

Polymorphismus kann durchinheritance ausgeführt werden, wobei Unterklassen Basisklassenmethoden verwenden oder diese überschreiben.

Pythonsduck typing, ein Sonderfall der dynamischen Typisierung, verwendet Techniken, die für den Polymorphismus charakteristisch sind, einschließlichlate binding unddynamic dispatch. Der Begriff "Ententypisierung" leitet sich aus einem Zitat des Schriftstellers James Whitcomb Riley ab: "Wenn ich einen Vogel sehe, der wie eine Ente läuft und wie eine Ente schwimmt und wie eine Ente quakt, nenne ich diesen Vogel eine Ente." In einer Nachricht an die comp.lang.python-Newsgroup, den Computeringenieur Alex Martelli, geht es bei der Verwendung der Ententypisierung darum, die Eignung eines Objekts für einen bestimmten Zweck festzustellen. Bei Verwendung der normalen Typisierung wird diese Eignung allein durch den Typ eines Objekts bestimmt. Bei der Ententypisierung wird jedoch das Vorhandensein von Methoden und Eigenschaften verwendet, um die Eignung und nicht den tatsächlichen Typ des betreffenden Objekts zu bestimmen. Das heißt, Sie prüfen, ob das Objekt wie eine Ente quakt und wie eine Ente läuft, anstatt zu fragen, ob das Objektiseine Ente ist.

Wenn mehrere Klassen oder Unterklassen dieselben Methodennamen, aber unterschiedliche Implementierungen für dieselben Methoden haben, sind die Klassen polymorph, da sie eine einzige Schnittstelle für die Verwendung mit Entitäten unterschiedlichen Typs verwenden. Eine Funktion kann diese polymorphen Methoden auswerten, ohne zu wissen, welche Klassen aufgerufen werden.

Polymorphe Klassen erstellen

Um den Polymorphismus zu nutzen, werden zwei unterschiedliche Klassen erstellt, die mit zwei unterschiedlichen Objekten verwendet werden. Jede dieser unterschiedlichen Klassen muss eine gemeinsame Schnittstelle haben, damit sie polymorph verwendet werden können. Daher geben wir ihnen Methoden, die unterschiedlich sind, aber denselben Namen haben.

Wir erstellen eineShark-Klasse und eineClownfish-Klasse, von denen jede Methoden fürswim(),swim_backwards() undskeleton() definiert.

polymorphic_fish.py

class Shark():
    def swim(self):
        print("The shark is swimming.")

    def swim_backwards(self):
        print("The shark cannot swim backwards, but can sink backwards.")

    def skeleton(self):
        print("The shark's skeleton is made of cartilage.")


class Clownfish():
    def swim(self):
        print("The clownfish is swimming.")

    def swim_backwards(self):
        print("The clownfish can swim backwards.")

    def skeleton(self):
        print("The clownfish's skeleton is made of bone.")

Im obigen Code haben sowohl dieShark- als auch dieClownfish-Klasse drei Methoden mit demselben Namen gemeinsam. Jede der Funktionen dieser Methoden unterscheidet sich jedoch für jede Klasse.

Lassen Sie uns diese Klassen in zwei Objekte instanziieren:

polymorphic_fish.py

...
sammy = Shark()
sammy.skeleton()

casey = Clownfish()
casey.skeleton()

Wenn wir das Programm mit dem Befehlpython polymorphic_fish.pyausführen, können wir sehen, dass sich jedes Objekt wie erwartet verhält:

OutputThe shark's skeleton is made of cartilage.
The clownfish's skeleton is made of bone.

Da wir nun über zwei Objekte verfügen, die eine gemeinsame Schnittstelle verwenden, können wir die beiden Objekte unabhängig von ihren einzelnen Typen auf dieselbe Weise verwenden.

Polymorphismus mit Klassenmethoden

Um zu zeigen, wie Python jeden dieser verschiedenen Klassentypen auf dieselbe Weise verwenden kann, können wir zuerst einfor loop erstellen, das durch eintuple von Objekten iteriert. Dann können wir die Methoden aufrufen, ohne uns Gedanken darüber zu machen, um welchen Klassentyp es sich bei jedem Objekt handelt. Wir werden nur davon ausgehen, dass diese Methoden tatsächlich in jeder Klasse existieren.

polymorphic_fish.py

...
sammy = Shark()

casey = Clownfish()

for fish in (sammy, casey):
    fish.swim()
    fish.swim_backwards()
    fish.skeleton()

Wir haben zwei Objekte,sammy der KlasseShark undcasey der KlasseClownfish. Unserefor-Schleife durchläuft diese Objekte und ruft jeweils die Methodenswim(),swim_backwards() undskeleton() auf.

Wenn wir das Programm ausführen, sieht die Ausgabe wie folgt aus:

OutputThe shark is swimming.
The shark cannot swim backwards, but can sink backwards.
The shark's skeleton is made of cartilage.
The clownfish is swimming.
The clownfish can swim backwards.
The clownfish's skeleton is made of bone.

Diefor-Schleife durchlief zuerst diesammy-Instanziierung derShark-Klasse und dann dascasey-Objekt derClownfish-Klasse, sodass wir die zugehörigen Methoden sehen Zuerst die KlasseShark, dann die KlasseClownfish.

Dies zeigt, dass Python diese Methoden auf eine Weise verwendet, ohne genau zu wissen oder sich darum zu kümmern, welcher Klassentyp jedes dieser Objekte ist. Das heißt, diese Methoden werden polymorph eingesetzt.

Polymorphismus mit einer Funktion

Wir können auch eine Funktion erstellen, die jedes Objekt aufnehmen kann und Polymorphismus zulässt.

Erstellen wir eine Funktion namensin_the_pacific(), die ein Objekt aufnimmt, das wirfish nennen können. Obwohl wir den Namenfish verwenden, kann jedes instanziierte Objekt in diese Funktion aufgerufen werden:

polymorphic_fish.py

…
def in_the_pacific(fish):

Als Nächstes geben wir der Funktion etwas zu tun, das dasfish-Objekt verwendet, das wir an sie übergeben haben. In diesem Fall rufen wir die Methodenswim() auf, von denen jede in den beiden KlassenShark undClownfish definiert ist:

polymorphic_fish.py

...
def in_the_pacific(fish):
    fish.swim()

Als Nächstes erstellen wir Instanziierungen der KlassenShark undClownfish, sofern diese noch nicht vorhanden sind. Mit diesen können wir ihre Aktion mit derselbenin_the_pacific()-Funktion aufrufen:

polymorphic_fish.py

...
def in_the_pacific(fish):
    fish.swim()

sammy = Shark()

casey = Clownfish()

in_the_pacific(sammy)
in_the_pacific(casey)

Wenn wir das Programm ausführen, sieht die Ausgabe wie folgt aus:

OutputThe shark is swimming.
The clownfish is swimming.

Obwohl wir beim Definieren ein zufälliges Objekt (fish) an die Funktionin_the_pacific() übergeben haben, konnten wir es dennoch effektiv für Instanziierungen der KlassenShark undClownfish verwenden . Dascasey-Objekt heißt die in derClownfish-Klasse definierteswim()-Methode, und dassammy-Objekt heißt die in derShark-Klasse definierteswim()-Methode .

Fazit

Indem Sie es verschiedenen Objekten ermöglichen, Funktionen und Methoden durch Polymorphismus auf ähnliche Weise zu nutzen, bietet die Verwendung dieser Python-Funktion eine größere Flexibilität und Erweiterbarkeit Ihres objektorientierten Codes.