Mit dem Begriff Polymorphie bezeichnet man die Möglichkeit, in objektorientierten Systemen Klassen, Objekte, Attribute und Methoden einzusetzen, ohne dass der konkrete Typ jeweils im Programmtext klar sein muss.
Die Übersetzung des Begriffes Polymorphie ist "Vielgestaltigkeit". Konkret bei Python betrifft das wegen der fehlenden Typdeklaration vor allem die Polymorphie bei Methoden.
Ein Programmtext enthalte einen Methodenaufruf. Welche konkrete Variante einer Methode aufgerufen wird, hängt dann aber davon ab, für welches konkrete Objekt diese Methode aufgerufen worden ist.
Zaehlerprojekt:
Ein einfaches Beispiel tritt im Zaehlerprojekt auf, wenn man einen ZyklischenZaehler einführt.
class Zaehler (object) : '''Klasse fuer einen einfachen Zaehler''' def __init__(self) : '''Konstruktor fuer Objekte vom Typ Zaehler''' self.__stand = 0 # int def Zaehle (self) : '''zaehlt den Zaehler jeweils um 1 weiter''' self.__stand += 1 def GibStand (self) : '''zeigt den Stand des Zaehlers an''' return self.__stand
class ZyklischerZaehler(Zaehler): def __init__(self, zyklus=3): """Konstruktor von ZyklischerZaehler""" Zaehler.__init__(self) self.__zyklus = zyklus def Zaehle(self): """Veraendernde Methode fuer den Stand. Diese Methode ueberschreibt Zaehle() von Zaehler, verwendet die Methode aber.""" super(ZyklischerZaehler,self).Zaehle() if self.GibStand()==self.__zyklus: self._Zaehler__stand = 0 # zuruecksetzen
Raumplanerprojekt:
Ein typisches Beispiel aus dem Raumplanerprojekt tritt bei einer Möbelgruppe auf. Beim Schreiben der Klasse MoebelGruppe ist belanglos, welche konkreten Möbelobjekte der Gruppe hinzugefügt werden und welche konkreten Attributwerte sie haben.
Alle in der Liste self.__komponenten auftretenden Objekte müssen aber die aufgerufene Methode bereit stellen. Für die Methode self.GibFigur() gilt das, solange sie Objekte von Klassen repräsentieren, die von der Klasse Moebel erben, denn Moebel stellt diese [hier abstrakt] bereit.
Für jedes konkrete Objekt kann daher die Methode unterschiedlich sein. Das wird möglich, da sie die [hier abstrakte] Methode GibFigur() von Moebel implementieren.
class MoebelGruppe(Moebel): def __init__(self, xPos=100, yPos=200, winkel=0, farbe='red'): """Konstruktor ...""" self.__komponenten=[] Moebel.__init__(self, xPos, yPos, 0, 0, winkel, farbe, True) def GibFigur(self): """definiert die zu zeichnende Figur""" path = self.GibZeichenPfad() for moebel in self.__komponenten: path.AddPath(moebel.GibFigur()) return self.Transformiere(path) ...
© Claus Albowski