Danke für die Antworten. Ihr benutzt beide Funktionen, um die Ausgabe des Objektes entsprechend zu modifizieren. Daran hatte ich auch schon gedacht, da fiel mir aber das Decorator Pattern ein ...
Das Beispiel von Christian finde ich eigentlich ganz fuchsig, nur finde ich die Festlegung der Darstellung bei der Erzeugung des Punktes nicht so gut, das würde ich wohl trennen. So könnte ich in einem ersten Schritt die Punkte und Linien einlesen und erzeugen und dann je nach Option das entsprechende Format auf die Punkte und Linien im weiterverarbeitenden Programmteil (Controller z.B. bei MVC) anwenden.
Und nach welchem Kriterium wird ausgewählt was da für eine Methode aufgerufen wird?
Mein nachgetragener Link zum Pattern erklärt eigentlich ganz gut, wie das Decorator Pattern funktioniert. Es basiert ja im Grunde darauf, dass die entsprechende Methode der Klasse im Decorator überschrieben wird.
Ein konkretes Beispiel:
In einer Datei stehen Punkte, die zusammen eine Linie (andere Datei) ergeben. Damit ich die Linien in ein anderes Format überführen kann, will ich sie in einem bestimmten Format in einer Datenbank speichern. Die Daten kann man mittels dem "Well Known Text" (WKT) Format im INSERT Befehl in die Tabelle schreiben. Das WKT definiert einen Punkt mittels folgender Darstellung:
POINT(x y) in 2D oder
POINT(x y z) in 3D. Linien werden mittels
LINESTRING(x1 y1, x2 y2, x3 y3) beschrieben. Da aber früher oder später andere Formate gefragt sind (GML, KML), suche ich eine Methode, die Punkte und Linien entsprechend des Formates mit einer Darstellung zu "dekorieren".
Die Textdateien sehen ungefähr so aus:
Punkte:
Linie:
Dazu habe ich mir eine Punktklasse geschrieben um die Punkte aufzunehmen und eine Linienklasse, die die Punktobjekte entgegennimmt. Jetzt möchte ich flexibel das Format für die Darstellung ändern (WKT, GML, KML, ...). Das Beispiel in meinem ersten Post erklärt die Sache am Punktobjekt eigentlich ganz gut, nur das es eben noch z.B. eine Klasse
Code: Alles auswählen
class KMLPoint(object):
def __init__(self, point):
self.point = point
def __repr__(self):
if self.point.z == None:
return "<coordinate>%s, %s</coordinate>" % (self.point.x, self.point.y)
else:
return "<coordinate>%s, %s, %s</coordinate>" % (self.point.x, self.point.y, self.point
und drölfzig weitere gibt.
Es mangelt ja nicht an Möglichkeiten, das umzusetzen, nur habe ich mich gefragt, wie man das eben in Python machen würde. Im Prinzip benötige ich ja immer nur einen Decorator (WKT oder XML oder whatever) und nicht wie beim Kaffeebeispiel Milch, Zucker und Schokobrösel
In der Zeit, wo ich diesen Post jetzt getippt habe, hätte ich wahrscheinlich mein Programm auf irgendeine Art und Weise ans Laufen gebracht, aber man will ja auch seinen Stil verbessern, vor allem als Umsteiger. Und da ich gerade genug Zeit habe, mir solche Fragen zu stellen tue ich das auch und lerne aus der Diskussion hier