Ich codiere ein kleines Python-Modul, das aus zwei Teilen besteht:
- einige Funktionen, die eine öffentliche Schnittstelle definieren,
- Eine Implementierungsklasse, die von den oben genannten Funktionen verwendet wird, aber außerhalb des Moduls keine Bedeutung hat.
Zuerst habe ich beschlossen, diese Implementierungsklasse zu "verbergen", indem ich sie innerhalb der Funktion definiere. Dies beeinträchtigt jedoch die Lesbarkeit und kann nicht verwendet werden, wenn mehrere Funktionen dieselbe Klasse wiederverwenden.
Gibt es also zusätzlich zu Kommentaren und Dokumentzeichenfolgen einen Mechanismus, um eine Klasse als "privat" oder "intern" zu markieren? Ich kenne den Unterstrichmechanismus, aber so wie ich ihn verstehe, gilt er nur für Variablen, Funktionen und Methodennamen.
quelle
Zusamenfassend:
Sie können die Privatsphäre nicht durchsetzen . In Python gibt es keine privaten Klassen / Methoden / Funktionen. Zumindest nicht strikte Privatsphäre wie in anderen Sprachen wie Java.
Sie können nur die Privatsphäre angeben / vorschlagen . Dies folgt einer Konvention. Die Python-Konvention zum Markieren einer Klasse / Funktion / Methode als privat besteht darin, ihr ein _ (Unterstrich) voranzustellen. Zum Beispiel
def _myfunc()
oderclass _MyClass:
. Sie können auch Pseudo-Datenschutz erstellen, indem Sie der Methode zwei Unterstriche voranstellen (z__foo
. B. :) . Sie können nicht direkt auf die Methode zugreifen, können sie jedoch über ein spezielles Präfix mit dem Klassennamen (z_classname__foo
. B. :) aufrufen . Das Beste, was Sie tun können, ist, die Privatsphäre anzuzeigen / vorzuschlagen, nicht sie durchzusetzen.Python ist in dieser Hinsicht wie Perl. Um eine berühmte Zeile über Privatsphäre aus dem Perl-Buch zu paraphrasieren, lautet die Philosophie, dass Sie sich aus dem Wohnzimmer heraushalten sollten, weil Sie nicht eingeladen wurden, nicht weil es mit einer Schrotflinte verteidigt wird.
Für mehr Informationen:
quelle
Definieren Sie
__all__
eine Liste der Namen, die exportiert werden sollen ( siehe Dokumentation ).quelle
Ein Muster, das ich manchmal benutze, ist folgendes:
Definieren Sie eine Klasse:
Erstellen Sie eine Instanz der Klasse und überschreiben Sie den Klassennamen:
Definieren Sie Symbole, die die Funktionalität verfügbar machen:
Löschen Sie die Instanz selbst:
Jetzt haben Sie ein Modul, das nur Ihre öffentlichen Funktionen verfügbar macht.
quelle
Die Konvention stellt internen Klassen, Funktionen und Variablen "_" voran.
quelle
Um das Problem der Designkonventionen anzugehen, und wie Christopher sagte, gibt es in Python wirklich kein "privates". Dies mag für jemanden mit C / C ++ - Hintergrund verdreht klingen (wie ich vor einiger Zeit), aber irgendwann werden Sie wahrscheinlich feststellen, dass das Befolgen von Konventionen ausreichend ist.
Etwas mit einem Unterstrich vor sich zu sehen, sollte ein guter Hinweis sein, um es nicht direkt zu verwenden. Wenn Sie sich mit unübersichtlicher
help(MyClass)
Ausgabe befassen (worauf jeder bei der Suche nach der Verwendung einer Klasse achtet), sind die unterstrichenen Attribute / Klassen dort nicht enthalten, sodass am Ende nur Ihre "öffentliche" Schnittstelle beschrieben wird.Wenn alles öffentlich ist, hat es auch seine eigenen Vorteile, zum Beispiel können Sie so ziemlich alles von außen einem Unit-Test unterziehen (was Sie mit privaten C / C ++ - Konstrukten nicht wirklich tun können).
quelle
Verwenden Sie zwei Unterstriche, um Namen von "privaten" Bezeichnern voranzustellen. Verwenden Sie für Klassen in einem Modul einen einzelnen führenden Unterstrich, und sie werden nicht mit "from module import *" importiert.
(In Python gibt es kein echtes "privat". Beispielsweise zerlegt Python die Namen von Klassenmitgliedern automatisch mit doppelten Unterstrichen
__clssname_mymember
. Wenn Sie also den verstümmelten Namen kennen, können Sie die Entität "privat" trotzdem verwenden . Siehe hier. Und natürlich können Sie manuell importieren „intern“ Klassen , wenn Sie will).quelle