3 Stimmen

Wie erstelle ich einen paketgeschützten Konstruktor in Python?

Ich möchte eine Fabrik Muster in Python, wo eine Klasse hat einige Konfiguration, und weiß, wie eine andere Klasse Objekt (oder mehrere Klassen) auf Anfrage zu bauen. Um dies zu vervollständigen, möchte ich verhindern, dass die erstellte Klasse außerhalb der Fabrik erstellt wird. In Java würde ich beides in dasselbe Paket packen und den Konstruktor der Klasse paketgeschützt machen.

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

Dankeschön

3voto

Katriel Punkte 115208

Das können Sie nicht. Die Python-Mentalität wird oft als "wir sind hier alle erwachsen" zusammengefasst; das heißt, Sie können die Leute nicht davon abhalten, Methoden aufzurufen, Attribute zu ändern, Klassen zu instanziieren und so weiter. Stattdessen sollten Sie eine offensichtliche Möglichkeit schaffen, eine Instanz Ihrer Klasse zu erzeugen, und dann davon ausgehen, dass diese auch benutzt wird.

2voto

Adam Vandenberg Punkte 18803

Bemühen Sie sich nicht, das ist nicht der Weg der Pythons.

Die bevorzugte Lösung besteht darin, einfach zu dokumentieren, welchen Konstruktor oder welche Factory-Methode die Clients aufrufen sollen, und sich nicht allzu viele Gedanken über öffentlich/privat zu machen (was in Python ohnehin nicht viel bedeutet; im Grunde ist alles öffentlich im Code).

2voto

Wim Coenen Punkte 64891

Die Konvention in Python ist, dass den Namen von internen Dingen voranzustellen (Mitglieder oder Klassen) mit einem Unterstrich . Es gibt keine Möglichkeit, den eingeschränkten Zugriff zu erzwingen, aber der Unterstrich dient als Signal, dass "Sie dies nicht berühren sollten".

Von der python einführung :

"Private" Instanzvariablen, auf die nur innerhalb eines Objekts zugegriffen werden kann, gibt es in Python nicht. Es gibt jedoch eine Konvention, die von den meisten Python-Codes befolgt wird: Ein Name, dem ein Unterstrich vorangestellt ist (z. B. _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). Er sollte als ein Implementierungsdetail betrachtet werden und kann ohne Vorankündigung geändert werden.

1voto

oneself Punkte 35977

Auf der Grundlage eines Kommentars von Wim kann man die Klasse des zu erstellenden Objekts mit einem einfachen oder doppelten Unterstrich beginnen. Auf diese Weise ist klar, dass der Konstruktor privat ist und nicht direkt aufgerufen werden sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X