2010-12-10 7 views
1

Ich möchte ein Factory-Muster in Python erstellen, wo eine Klasse einige Konfiguration hat, und weiß, wie man ein Objekt einer anderen Klasse (oder mehrere Klassen) bei Bedarf erstellen kann. Um das zu vervollständigen, möchte ich verhindern, dass die erstellte Klasse außerhalb der Factory erstellt wird. In Java würde ich beide in dasselbe Paket einfügen und das Konstruktorpaket der Klasse schützen.Wie erstelle ich einen paketgeschützten Konstruktor in Python?

Für normale Methodennamen oder Variablen kann man der Python-Konvention folgen und einzelne oder doppelte Unterstriche verwenden ("_foo" oder "__foo"). Gibt es eine Möglichkeit, so etwas für einen Konstrukteur zu tun?

Vielen Dank

Antwort

1

Basierend auf einem Kommentar von Wim kann man die Klasse des zu erstellenden Objekts benennen, beginnend mit einem einzelnen oder doppelten Unterstrich. Auf diese Weise ist klar, dass der Konstruktor privat ist und nicht direkt aufgerufen werden sollte.

+0

Nicht sicher, warum dies bei Null ist - das scheint ein guter, pythonischer Weg zu sein, um eine Klasse zu erstellen, die in Ordnung ist, aber nicht instanziiert werden sollte. Vielleicht würde ich diese Antwort ändern, um zu sagen: "So ist es klar, dass der Konstruktor _protected_ ist und nur von abgeleiteten Klassen aufgerufen werden sollte"). –

3

Sie können nicht. Die Python-Mentalität wird oft als "Wir sind alle Erwachsene hier" zusammengefasst; Das heißt, Sie können nicht aufhören, Methoden aufzurufen, Attribute zu ändern, Klassen zu instanziieren und so weiter. Stattdessen sollten Sie eine offensichtliche Möglichkeit zum Erstellen einer Instanz Ihrer Klasse erstellen und dann davon ausgehen, dass sie verwendet wird.

2

Mach dir keine Mühe, es ist nicht der Python Weg. Die bevorzugte Lösung besteht darin, einfach zu dokumentieren, welche Constructor- oder Factory-Methode-Clients aufgerufen werden sollen, und sich nicht zu viele Gedanken um public/private zu machen (was in Python sowieso nicht viel bedeutet; alles ist im Wesentlichen public-in-code) .) in Python

2

die Konvention ist der Name der internen Dinge (Mitglieder oder Klassen) mit einem Unterstrich zu Präfix. Es gibt keine Möglichkeit, eingeschränkten Zugriff zu erzwingen, aber die Unterstreichung dient als ein Signal, dass "Sie dies nicht berühren sollten".

Vom python tutorial:

„Privat“ Instanzvariablen, die nicht außer aus dem Inneren eines Objekts zugegriffen werden kann, nicht in Python existieren. Es gibt jedoch eine Konvention, der der meiste Python-Code folgt: Ein Name, dem ein Unterstrich vorangestellt ist (zB _spam), sollte als nichtöffentlicher Teil der API behandelt werden (unabhängig davon, ob es sich um eine Funktion, eine Methode oder ein Datenelement handelt). . Es sollte als Implementierungsdetail betrachtet und ohne Vorankündigung geändert werden.

+1

Und '__double_underscore' Namen sind tatsächlich entstellt, was keine Sicherheit erzwingt, aber Probleme verursacht. – katrielalex

+2

Dies kann jedoch nicht auf einem Konstruktor verwendet werden, oder? – oneself

+1

@onself: Sie rufen den Konstruktor auf, indem Sie den Klassennamen verwenden, und Sie können einen Unterstrich in den Klassennamen einfügen. –