Factory-Pattern in Python

Nov 2004
16

Ich glaube man muss aufpassen, wenn man aus der Java-Welt kommt und den dort üblichen Pattern-Overkill auf Python überträgt. Zudem viele Standard-Pattern aufgrund der Dynamik der Sprache nicht unbedingt gebraucht werden oder es bessere Lösungen gibt.

Nichstdestotrotz hatte ich mal wieder einen Wow-Effekt, beim Versuch eine Factory für meine Klassen zu bauen. Nachdem ich einige Zeit mit Modulen und Packages in Python gekämpft hatte — das ist halt doch etwas anders als in Java — hatte ich ein Modul Bookmarks, in dem meine Klassen für die Bookmark-Repräsentation der unterschiedlichen Browser gesammelt waren (Safari, Firefox und Camino). Die Factory-Methode ist als Funktion des Moduls implementiert, also keiner Klasse zugeordnet und soll mir eine Safari-Klasse geben, wenn ich sie mit dem String “Safari” aufrufe. Nichts leichter als das;

def factory(className, *args):
    aClass = getattr(__import__(__name__), className)
    return apply(aClass, args)

die erste Zeile mit dem getattr-Aufruf sorgt dafür, dass ich über einen String die Objekt-Referenz bekomme. Der komische erste Parameter gibt mir die Referenz auf das Modul, in dem ich mich gerade befinde, sonst müsste ich von außerhalb des Moduls das getattr aufrufen und die Factory dann mit der Referenz auf das Objekt aufrufen.

Die praktische apply-Methode erzeugt mir nun meine Klasse mit allen Parametern, die ich als zusätzliche Parameter übergebe, z.B.:

importer = Bookmarks.factory('Firefox', firefox_file)

Das rockt ;-)

Apropos DesignPattern: Aus der Head-First-Serie von O’Reilly ist ein Titel über DesignPatterns erschienen. Sieht sehr vielversprechend aus, denn das Head First Java und das ganze Konzept der Serie hat mir gut gefallen. Und die Literatur über Pattern ist eher mau. Das GangOfFour ist nicht mein Ding, das freie Thinking in Patterns von Bruce Eckel ist bisher mein Favorit.

Kommentare:

Tut mir leid, es sind keine Kommentare mehr möglich.