Laut http://www.faqs.org/docs/diveintopython/fileinfo_private.html :
Wie die meisten Sprachen hat Python das Konzept privater Elemente:
- Private Funktionen, die nicht von außerhalb ihres Moduls aufgerufen werden können
Wenn ich jedoch zwei Dateien definiere:
#a.py
__num=1
und:
#b.py
import a
print a.__num
Wenn ich b.py
es starte, wird es 1
ohne Ausnahme ausgedruckt. Ist Diveintopython falsch oder habe ich etwas falsch verstanden? Und ist es eine Möglichkeit , tun ein Moduls Funktion als privat definieren?
>>> import fileinfo >>> m = fileinfo.MP3FileInfo() >>> m.__parse("/music/_singles/kairo.mp3") 1 Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
fileinfo.MP3FileInfo () ist eine Instanz der Klasse. Dies gibt diese Ausnahme, wenn Sie einen doppelten Unterstrich verwenden. Während Sie in Ihrem Fall keine Klasse erstellt haben, haben Sie nur ein Modul erstellt. Siehe auch: stackoverflow.com/questions/70528/…Antworten:
In Python hängt "Datenschutz" von der Zustimmung der Erwachsenen ab - Sie können dies nicht erzwingen (genauso wenig wie im wirklichen Leben ;-). Ein einziger führender Unterstrich bedeutet , dass Sie nicht sollte den Zugriff auf mich „von außen“ - zwei führenden Unterstrichen (w / o Nachlauf Unterstreicht) trägt die Botschaft noch mehr Nachdruck ... aber am Ende, es hängt immer noch von sozialem Konvention und Konsens: Pythons Selbstbeobachtung ist so stark, dass Sie nicht jedem anderen Programmierer auf der Welt Handschellen anlegen können , um Ihre Wünsche zu respektieren.
((Übrigens, obwohl es ein streng gehütetes Geheimnis ist, gilt dies auch für C ++: Bei den meisten Compilern ist eine einfache
#define private public
Zeile vor dem#include
Erstellen Ihrer.h
Datei alles, was geschickte Codierer benötigen, um Ihre "Privatsphäre" zu verfälschen ...! -) )quelle
static void foo()
so privat wie es nur geht. Es ist zumindest für den Linker verborgen, und die Funktion kann durch Inlining vollständig entfernt werden.Es kann zu Verwechslungen zwischen Klassenprivaten und Modulprivaten kommen .
Ein privates Modul beginnt mit einem Unterstrich.
Ein solches Element wird bei Verwendung der
from <module_name> import *
Form des Importbefehls nicht mitkopiert . Es wird jedoch importiert, wenn dieimport <moudule_name>
Syntax verwendet wird ( siehe Antwort von Ben Wilhelm ).Entfernen Sie einfach einen Unterstrich aus der a .__ Nummer des Beispiels der Frage, und es wird nicht in Modulen angezeigt, die a.py mithilfe der
from a import *
Syntax importieren .Eine private Klasse beginnt mit zwei Unterstrichen (auch bekannt als dunder ie d-ouble underscore). Bei einer
solchen Variablen wird der Name "entstellt", um den Klassennamen usw. einzuschließen. Auf
sie kann auch außerhalb der Klassenlogik über den verstümmelten Namen zugegriffen werden.
Obwohl die Namensverknüpfung als milde Verhinderungsmaßnahme gegen unbefugten Zugriff dienen kann, besteht ihr Hauptzweck darin, mögliche Namenskollisionen mit Klassenmitgliedern der Ahnenklassen zu verhindern. Siehe Alex Martellis lustigen, aber genauen Hinweis auf einwilligende Erwachsene, während er die Konvention beschreibt, die in Bezug auf diese Variablen verwendet wird.
quelle
__private_function
? Ich bin darauf gestoßen und habe dadurch Fehler gemacht.Diese Frage wurde nicht vollständig beantwortet, da der Datenschutz von Modulen nicht rein konventionell ist und die Verwendung des Imports den Datenschutz von Modulen je nach Verwendungszweck möglicherweise erkennt oder nicht.
Wenn Sie eine private Namen in einem Modul definieren, diese Namen werden werden in jedes Skript importiert, die die Syntax verwendet, ‚Import module_name‘. Angenommen, Sie haben in Ihrem Beispiel das Modul private, _num, in a.py wie folgt korrekt definiert.
..Sie können in b.py mit dem Symbol für den Modulnamen darauf zugreifen:
Um nur Nicht-Privates aus a.py zu importieren, müssen Sie die from- Syntax verwenden:
Aus Gründen der Übersichtlichkeit ist es jedoch besser, beim Importieren von Namen aus Modulen explizit anzugeben, als sie alle mit einem '*' zu importieren:
quelle
_names
aufgerufen werden mitimport a
- sie sind Zugriffe alsa._names
wenn mit diesem Stil.__init__.py
Datei importierten Funktionen an . Sehen Sie hier für einige Hilfe , dass auf.Python erlaubt private Klassenmitglieder mit dem doppelten Unterstrichpräfix. Diese Technik funktioniert nicht auf Modulebene, daher denke ich, dass dies ein Fehler in Dive Into Python ist.
Hier ist ein Beispiel für private Klassenfunktionen:
quelle
Sie können eine innere Funktion hinzufügen:
So etwas, wenn Sie wirklich dieses Maß an Privatsphäre benötigen.
quelle
Dies ist eine alte Frage, aber sowohl modulierte private (ein Unterstrich) als auch klassenprivate (zwei Unterstriche) verstümmelte Variablen werden jetzt in der Standarddokumentation behandelt:
Das Python-Tutorial » Klassen » Private Variablen
quelle
eingebettet in Verschlüsse oder Funktionen ist eine Möglichkeit. Dies ist in JS üblich, wird jedoch nicht für Nicht-Browser-Plattformen oder Browser-Mitarbeiter benötigt.
In Python scheint es ein bisschen seltsam, aber wenn etwas wirklich versteckt werden muss, könnte das der Weg sein. Mehr auf den Punkt zu bringen, die Python-API zu verwenden und Dinge zu behalten, die im C (oder einer anderen Sprache) versteckt werden müssen, ist wahrscheinlich der beste Weg. Andernfalls würde ich den Code in eine Funktion einfügen, diesen aufrufen und die zu exportierenden Elemente zurückgeben lassen.
quelle
Python verfügt über drei Modi über., Privat, öffentlich und geschützt. Beim Importieren eines Moduls kann nur auf den öffentlichen Modus zugegriffen werden. Daher können private und geschützte Module nicht von außerhalb des Moduls aufgerufen werden, dh wenn es importiert wird.
quelle