Moving Beyond Factories in Python

7

Wenn ich von Java zu Python komme, wurde mir gesagt, dass Fabriken nicht Pythonic sind. Daher suche ich nach a dem Python-Weg, etwas wie das Folgende zu tun. (Ich vereinfache mein Ziel zu sehr, damit ich nicht mein ganzes Programm beschreiben muss, was sehr kompliziert ist).

Mein Skript liest Namen von Personen (zusammen mit einigen Informationen über sie) ein und konstruiert daraus Objekte vom Typ Person. Die Namen können wiederholt werden, und ich möchte nur eine Personeninstanz pro Name. Diese Personen können auch den Unterklassen Mann und Frau angehören.

Eine Möglichkeit wäre, eine PersonFactory zu erstellen, die entweder einen neu instanziierten Mann oder Frau oder einen Verweis auf den zuvor instanziierten Mann / die gleiche Frau mit demselben Namen zurückgibt. Die andere wäre, eine Menge aller Person-Objekte zu erzeugen und jedes Mal nach der Anwesenheit einer Person mit dem gegebenen Namen zu suchen, bevor ein neues Objekt instanziiert wird. Keine Annäherung kommt mir jedoch als Pythonic vor. Das erste scheint etwas zu umständlich für Python zu sein (eine ganze Klasse zu erstellen, nur um mit der Erstellung eines anderen Objekts fertig zu werden? Wirklich?) Und die zweite wird schnell teuer, da ich viele Namen verarbeiten muss.

    
chimeracoder 26.08.2010, 03:04
quelle

6 Antworten

12

Ich glaube nicht, dass Fabriken unpythonisch sind. Du brauchst jedoch keine ganze Klasse. Ein großer Unterschied zwischen Java und Python besteht darin, dass Sie in Python Code außerhalb von Klassen verwenden können. Vielleicht möchten Sie eine Factory-Funktion erstellen. Oder Sie können die Factory zu einer Klassenmethode für die Person-Klasse machen:

%Vor%

Im Python-Code sind oft die gleichen Muster wie in Java im Einsatz, aber wir machen uns nicht so viele Gedanken darüber. In Java hättest du eine ganz neue Klasse, die eine ganz neue .java-Datei implizieren würde, und du müsstest es zu einem Singleton machen usw. usw. Java scheint diese Art von Komplexität zu erzeugen. Eine einfache Klassenmethode reicht, also benutze sie einfach.

    
Ned Batchelder 26.08.2010, 03:13
quelle
2

Eine freistehende Funktion def PersonFactory(name, gender): ist in Ordnung, obwohl es als Klassenmethode, wie @Ned suggeriert, nicht schaden sollte (in diesem speziellen Fall wird es auch nicht viel helfen, da die genaue Klasse der Person instanziieren muss variieren). Ich denke, dass die sauberste Implementierung tatsächlich eine freistehende Funktion ist, nur weil ich eine Klassenmethode bevorzuge, die Instanzen der aufgerufenen Klasse zurückgibt (anstatt einer anderen Klasse) - aber das ist ein stilistischer Punkt, der nicht sein kann soll in beiden Richtungen scharf definiert sein.

Ich würde es kodieren (mit einigen Annahmen, von denen ich hoffe, dass sie klar sind, zB wird das Geschlecht als M oder F codiert und, wenn nicht angegeben, heuristisch aus dem Namen, & amp; c) abgeleitet:

%Vor%     
Alex Martelli 26.08.2010 04:49
quelle
2

Die Stelle, an der die Registrierung "keine zwei Objekte mit gleichem Schlüssel" erfolgen soll, ist in __new__ , wie folgt:

%Vor%

druckt:

%Vor%

Ich habe auch einen Stich auf Ihre Mann / Frau-Unterscheidung gemacht, aber ich bin nicht begeistert davon.

    
PaulMcG 26.08.2010 10:56
quelle
2
%Vor%

Da Python Ihnen erlaubt Dinge wie das Speichern von Klassentypen in einem Diktat zu tun, brauchen Sie keine Factory; Sie können einfach einen Typ nachschlagen und ihn instanziieren.

    
Amber 26.08.2010 03:11
quelle
0

Der einfachste Weg ist wahrscheinlich, eingebauten lu_cache von functools auf __new__ zu verwenden.

%Vor%     
Veky 29.07.2016 13:58
quelle

Tags und Links