"Private" (Umsetzung) - Klasse in Python
Ich bin der Codierung ein kleines Python-Modul, das aus zwei teilen:
- einige Funktionen Definition einer öffentlichen Schnittstelle,
- eine Implementierung verwendete Klasse von den oben genannten Funktionen, aber das ist nicht sinnvoll außerhalb des Moduls.
Zunächst, entschied ich mich zu "verstecken" diese Implementierung der Klasse, indem Sie diese innerhalb der Funktion verwenden, aber das erschwert die Lesbarkeit und kann nicht verwendet werden, wenn mehrere Funktionen die Wiederverwendung der gleichen Klasse.
So, zusätzlich zu Kommentaren und docstrings, gibt es einen Mechanismus, um zu markieren eine Klasse als "private" oder "interne"? Ich bin mir bewusst, Unterstrich Mechanismus, aber wie ich es verstehe, es bezieht sich nur auf Variablen -, Funktions-und Methoden-Namen.
InformationsquelleAutor der Frage oparisy | 2009-02-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie einen einzelnen Unterstrich-prefix:
Dies ist die offizielle Python-Konvention für die 'interne' - Symbole; "from Modul import *" nicht importieren Unterstrich vorangestellt Objekte.
Edit: Verweis auf die einzelner Unterstrich-Konvention
InformationsquelleAutor der Antwort Ferdinand Beyer
Kurz:
Sie nicht durchsetzen können Privatsphäre. Es gibt keine eigenen Klassen/Methoden/Funktionen in Python. Zumindest nicht strengen Datenschutz, wie in anderen Sprachen, wie Java.
Können Sie nur angeben/vorschlagen, Privatsphäre. Dies folgt der Konvention. Die python-Konvention für die Kennzeichnung einer Klasse/Funktion/Methode als private, ist zum Vorwort mit einem _ (Unterstrich). Zum Beispiel
def _myfunc()
oderclass _MyClass:
. Sie können auch pseudo-Privatsphäre durch die einleitende Methode mit zwei Unterstrichen (zB:__foo
). Sie können nicht auf die Methode nicht direkt, aber Sie können es immer noch durch ein spezielles Präfix mit der Klassenname (z.B.:_classname__foo
). So dass die beste Sie tun können, ist zeigen/vorschlagen, Privatsphäre, nicht durchsetzen.Python ist wie perl in dieser Hinsicht. In Anlehnung an eine berühmte Zeile über den Datenschutz aus dem Perl-Buch, das die Philosophie ist, dass Sie bleiben sollte aus dem Wohnzimmer, weil Sie nicht eingeladen, nicht weil Sie verteidigt wird mit einer Schrotflinte.
Weitere Informationen:
InformationsquelleAutor der Antwort Karl Fast
Definieren
__all__
eine Liste der Namen, die Sie exportieren wollen (siehe Dokumentation).InformationsquelleAutor der Antwort UncleZeiv
Einem Muster, das ich manchmal benutze, ist dieses:
Definieren Sie eine Klasse:
Erstellen Sie eine Instanz der Klasse und überschreiben Sie den Namen der Klasse:
Definieren, die Symbole, expose die Funktionalität:
Löschen der Instanz selbst:
Jetzt haben Sie ein Modul, das nur macht Ihren öffentlichen Funktionen.
InformationsquelleAutor der Antwort theller
Des übereinkommens ist die Stelle "_" interne Klassen, Funktionen und Variablen.
InformationsquelleAutor der Antwort Benjamin Peterson
Um das Thema design-Konventionen, und als Christopher sagte, es gibt wirklich keine solche Sache als "privat" in Python. Das klingt twisted jemand kommen von C/C++ background (wie ich mich eine Weile zurück), aber schließlich, werden Sie wahrscheinlich feststellen folgenden Konventionen ist reichlich genug.
Etwas sehen kann, was mit einem Unterstrich in der front sollte ein guter Hinweis, es nicht zu verwenden direkt. Wenn Sie besorgt sind, mit Poltern
help(MyClass)
- Ausgang (das ist das, was jeder sieht bei der Suche auf, wie Sie zu einer Klasse), die Unterstrichen Attribute/Klassen sind dort nicht enthalten, also werden Sie am Ende nur mit Ihrem "öffentlichen" Schnittstelle beschrieben.Plus, alles öffentlichen hat seine eigene genial Vergünstigungen, wie zum Beispiel, können Sie die unit-test so ziemlich alles, was von außen (die Sie kann nicht wirklich mit C/C++ private-Konstrukte).
InformationsquelleAutor der Antwort Dimitri Tcaciuc
Verwenden Sie zwei Unterstriche Präfix Namen "eigenes" Kennzeichen. Für die Klassen in einem Modul mit einer einzigen führenden Unterstrich und Sie werden nicht importiert "from Modul import *".
(Es gibt keine solche Sache als wahr "privat" in Python. Zum Beispiel, Python automatisch verstümmelt die Namen der Schüler, die mit doppelten Unterstrichen werden
__clssname_mymember
. Also wirklich, wenn Sie wissen, die entstellten Namen können Sie mit der "privaten" Person sowieso. Siehe hier. Und natürlich können Sie wählen, manuell zu importieren "internen" Klassen, wenn Sie wollte).InformationsquelleAutor der Antwort chroder