Was ist der Sinn von einem Einzel - und einem Doppel-Unterstrich vor dem Objekt-Namen?
Ich möchte klar diese up ein für alle mal. Kann mir bitte jemand erklären die genaue Bedeutung des mit führenden Unterstrichen, bevor ein Objekt in Python? Auch erklären Sie den Unterschied zwischen einem einzelnen und einem doppelten Unterstrich am Anfang. Auch, dass die Bedeutung gleich bleiben, ob das Objekt in Frage ist eine variable, eine Funktion, eine Methode, etc?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einzelner Unterstrich
Namen, eine Klasse, mit einem führenden Unterstrich sind einfach zu geben, um anderen Programmierern, die das Attribut bzw. die Methode soll privat sein. Jedoch, nichts besonderes ist geschehen durch den Namen selbst.
Zitieren PEP-8:
Doppelten Unterstrich (Name Mangling)
Vom die Python docs:
Und eine Warnung von der gleichen Seite:
Beispiel
InformationsquelleAutor der Antwort Andrew Keeton
Ausgezeichnete Antworten so weit, aber einige Kleinigkeiten fehlen. Einen einzelnen führenden Unterstrich ist nicht genau nur eine Konvention: wenn Sie
from foobar import *
Modulfoobar
definiert nicht eine__all__
Liste, die Namen, die aus dem Modul importiert nicht schließen diejenigen ein, mit einem führenden Unterstrich. Lassen Sie uns sagen, es ist meist eine Konvention, da dieser Fall ziemlich dunklen Ecke;-).Den führenden Unterstrich-Konvention ist weit verbreitet, nicht nur für private Namen, sondern auch für das, was C++ nennen würde geschützt -- zum Beispiel die Namen der Methoden, die sich voll und soll von Unterklassen überschrieben werden (auch diejenigen, die haben außer Kraft gesetzt werden, da in der Basisklasse, die Sie
raise NotImplementedError
!-) oft sind single-leading-underscore Namen zu geben, um code mit Instanzen dieser Klasse (oder Unterklassen), die sagte, Methoden sind nicht dazu gedacht, direkt aufgerufen werden.Beispielsweise, um eine thread-sichere queue mit unterschiedlichen queueing-Disziplin als FIFO, man importiert Warteschlange, Unterklassen Warteschlange.Warteschlange, und überschreibt Methoden wie
_get
und_put
; "client code" nie nennt die ("Haken") Methoden, sondern die ("organisieren") public Methoden wieput
undget
(dies ist bekannt als die Template-Methode design-Muster-siehe z.B. hier für eine interessante Präsentation basiert auf einem video von einem Vortrag von mir zu dem Thema, mit dem Zusatz von Synopsen der Abschrift).InformationsquelleAutor der Antwort Alex Martelli
__foo__
: dies ist nur eine Konvention, eine Möglichkeit für das Python-system zu verwenden, Namen, die keine Konflikte mit den Benutzer-Namen._foo
: dies ist nur eine Konvention, eine Möglichkeit für den Programmierer, um anzuzeigen, dass die variable ist privat (was auch immer das bedeutet in Python).__foo
: dieses echte Bedeutung hat: der interpreter ersetzt diesen Namen mit_classname__foo
als ein Weg, um sicherzustellen, dass die Namen überschneiden sich nicht mit ähnlichen Namen in einer anderen Klasse.Keine andere form unterstreicht Bedeutung in der Python-Welt.
Gibt es keinen Unterschied zwischen Klassen, Variablen, global, etc, die in diesen Konventionen.
InformationsquelleAutor der Antwort Ned Batchelder
._variable
ist halbprivaten und bedeutete gerade für die convention.__variable
wird oft fälschlicherweise als superprivate, während es die eigentliche Bedeutung ist nur zu namemangle zu verhindern versehentlichen Zugriff[1].__variable__
ist in der Regel reserviert für builtin-Methoden oder VariablenKönnen Sie immer noch Zugriff auf die
.__mangled
Variablen, wenn Sie dringend wollen. Die doppelten Unterstriche nur namemangles, oder benennt die variable, die zu so etwas wieinstance._className__mangled
Beispiel:
t._b zugänglich ist, denn Sie ist nur verdeckt durch Konvention
t.__ein nicht gefunden, weil es nicht mehr existiert aufgrund namemangling
Durch den Zugriff auf
instance._className__variable
statt nur den doppelten Unterstrich den Namen, können Sie auf die verborgenen WertInformationsquelleAutor der Antwort
Einzelner Unterstrich am Anfang:
Python keine realen privaten Methoden. Stattdessen wird ein Unterstrich am Anfang einer Methode oder Attribut-name heißt, Sie sollten nicht auf diese Methode zugreifen, denn es ist nicht Teil der API.
(Dieses code-snippet stammt aus django-source-code: django/forms/forms.py). In diesem code
errors
ist ein öffentliches Eigentum, aber die Methode dieser Eigenschaft fordert, _get_errors, ist "privat", so sollten Sie nicht darauf zugreifen.Zwei Unterstriche am Anfang:
Dies bewirkt, dass eine Menge Verwirrung. Es sollte nicht verwendet werden, zum erstellen einer private-Methode. Es sollte verwendet werden, um zu vermeiden, dass Ihre Methode von einer Unterklasse überschrieben oder versehentlich zugegriffen. Mal sehen, ein Beispiel:
Ausgabe:
Nun erstellen Sie eine Unterklasse B und machen die Anpassung für __test Methode
Ausgang sein wird....
Wie wir gesehen haben, A. test() nicht rufen Sie B.__test () - Methode, wie wir erwarten. Aber in der Tat, dies ist das richtige Verhalten, für __. Die zwei Methoden mit dem Namen __test() werden automatisch umbenannt (entstellten) _A__test() und _B__test(), so dass Sie nicht versehentlich überschreiben. Wenn Sie eine Methode erstellen, beginnend mit __ es bedeutet, dass Sie nicht wollen, um jemand in der Lage sein, um es zu überschreiben, und Sie nur wollen, um es von innen seine eigene Klasse.
Zwei Unterstriche am Anfang und am Ende:
Wenn wir sehen, dass eine Methode wie
__this__
nennen Sie es nicht. Dies ist eine Methode, die python aufrufen soll, nicht Sie. Lassen Sie uns nehmen einen Blick:Es ist immer ein operator oder eine native Funktion, die nennt diese Magische Methoden. Manchmal ist es nur ein Haken python Anrufe in bestimmten Situationen. Zum Beispiel
__init__()
wird aufgerufen, wenn das Objekt erstellt wird, nachdem__new__()
genannt wird, zum erstellen der Instanz...Nehmen wir ein Beispiel...
Für mehr details, siehe die PEP-8-Anleitung. Für mehr Magische Methoden finden Sie unter PDF.
InformationsquelleAutor der Antwort
Manchmal haben Sie was zu sein scheint ein Tupel mit einem führenden Unterstrich, als in
In diesem Fall, was Los ist, dass _() ist ein alias für eine Lokalisierungsfunktion, die arbeitet auf text zu setzen, es in der richtigen Sprache, etc. basierend auf dem Gebietsschema. Zum Beispiel, Sphinx, der dies tut, und Sie finden unter den Einfuhren
und sphinx.Gebietsschema _() zugeordnet ist, als einen alias von einigen Lokalisierungs-Funktion.
InformationsquelleAutor der Antwort
Unterstrich (_) in Python
Folgenden sind verschiedene Orte, an denen _ wird verwendet, in Python:
Einzelner Unterstrich:
Doppelten Unterstrich:
__leading_double_Unterstrich
before_after
Einzelner Unterstrich
Dolmetscher:
_ gibt den Wert des zuletzt ausgeführten Ausdrucks Wert in Python REPL
Ignoriert Werte:
Mehrere Zeit, die wir nicht wollen, return-Werte zu dieser Zeit zuweisen dieser Werte zu wnderscore. Es verwendet als " Wegwerf-variable.
Nach einem Namen
Python hat Ihre standardmäßig keywords, die wir nicht verwenden können, als den Namen der variable. Zur Vermeidung solcher Konflikt zwischen python-Schlüsselwort und die variable, die wir benutzen den Unterstrich nach dem Namen
Beispiel:
Bevor Sie einen Namen
Führenden Unterstrich vor der variable/Funktion/Methode-name zeigt an, für den Programmierer, Es ist nur für die interne Verwendung, die geändert werden können, wenn die Klasse wollen.
Hier-Namen-Präfix durch einen Unterstrich wird behandelt, als nicht-öffentlich.
Wenn Sie angeben, aus Import * werden alle Namen beginnt mit " _ " werden nicht importiert.
Python nicht angeben, wirklich privat ist, sodass diese Karten kann man direkt aufrufen von anderen Modulen, wenn es angegeben ist in alleWir nennen es auch schwache Private
Aufrufende Datei von REPL
__leading_double_Unterstrich
Doppelten führenden Unterstriche sagen python-interpreter neu schreiben Namen um Konflikte zu vermeiden in der Unterklasse.Dolmetscherin ändert die variable name mit Klasse Erweiterung und das feature, bekannt als die Mangeln.
testFile.py
Aufruf von REPL
In Mangeln python-interpreter ändern Sie die variable name mit ___. Also Mehrere Zeit als Privates Mitglied, weil eine andere Klasse kann nicht auf die variable direkt. Hauptzweck __ ist die Verwendung der variable/Methode in der Klasse nur, Wenn Sie es verwenden möchten, die außerhalb der Klasse, die Sie können stellen öffentliche api
Aufruf von REPL
__, BEVOR SIE_NACH__
Namen mit mit __ und endet mit der gleichen Auffassung, spezielle Methoden in Python. Python bieten, diese Methoden zu nutzen, wie es der operator überladen, die vom Benutzer abhängig.
Python bietet dieses übereinkommen unterscheiden zwischen der Benutzer-definierte Funktion mit dem Modul die Funktion
Aufruf von REPL
Referenz
InformationsquelleAutor der Antwort
Wenn man wirklich will, dass eine variable nur Lesen, IMHO der beste Weg wäre, um Eigenschaft() nur mit get übergeben werden. Mit der Eigenschaft() können wir die vollständige Kontrolle über die Daten.
Verstehe ich, dass die OP fragte eine etwas andere Frage, aber da fand ich eine andere Frage zu Fragen, " wie private Variablen markiert duplizieren mit diesem, habe ich gedacht, das hinzufügen dieser zusätzlichen info hier.
InformationsquelleAutor der Antwort
Einzige führende Unterstriche ist eine Konvention. es gibt keinen Unterschied von der Dolmetscherin, wenn, ob Namen beginnt mit einem einzigen Unterstrich oder nicht.
Doppel-führende und nachfolgende Unterstriche werden verwendet für integrierte Methoden, wie
__init__
__bool__
usw.Doppelte führende Unterstriche w/o nachgestellte Gegenstücke sind eine Konvention, aber auch die Klasse Methoden werden verstümmelt durch den Dolmetscher. Für Variablen oder basic-Funktion Namen kein Unterschied besteht.
InformationsquelleAutor der Antwort SilentGhost
Deine Frage ist gut, es ist nicht nur über die Methoden. Funktionen und Objekte-Module werden Häufig als Präfix mit einem Unterstrich als gut, und kann vorangestellt werden zwei.
Aber __double_Unterstrich Namen nicht auf das name-Mangling in Module, zum Beispiel. Was passiert, ist, dass die Namen beginnen mit einem (oder mehr) Unterstrichen werden nicht importiert, wenn Sie alle importieren aus einem Modul (aus Modul import *), noch werden die Namen angezeigt, in der Hilfe(Modul).
InformationsquelleAutor der Antwort
Hier ist ein einfaches anschauliches Beispiel, wie doppelten Unterstrich Eigenschaften beeinflussen kann eine geerbte Klasse. Also mit folgendem setup:
wenn Sie dann erstellen Sie eine untergeordnete Instanz in der python-REPL, sehen Sie das unten
Dies mag offensichtlich sein, einige, aber es erwischte mich unvorbereitet, in einer viel komplexeren Umwelt
InformationsquelleAutor der Antwort
"Private" Instanz-Variablen kann nicht zugegriffen werden, außer in einem Objekt existiert nicht in Python. Jedoch, es ist eine Konvention, die gefolgt wird von den meisten Python-code: ein name mit einem Unterstrich als Präfix (z.B. _spam) sollten behandelt werden wie ein nicht-öffentlicher Teil der API (ob es sich um eine Funktion, eine Methode oder eine Daten-Mitglied). Es sollte überlegt werden, eine Implementierung detail und ohne Vorankündigung zu ändern.
Referenz
https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references
InformationsquelleAutor der Antwort
Immer die Fakten der _ und __ ist ziemlich einfach; die übrigen Antworten äußern Sie ziemlich gut. Die Verwendung ist weitaus schwieriger zu bestimmen.
Dies ist, wie ich es sehe:
Sollte verwendet werden, um anzugeben, dass eine Funktion nicht für die öffentliche Nutzung, wie zum Beispiel eine API. Diese und der import Einschränkung machen Verhalten sich ähnlich wie
internal
in c#.Sollte verwendet werden, um zu vermeiden, den Namen Kollision in der inheritace hirarchy und vermeiden Sie späte Bindung nutzen. Ähnlich wie private in c#.
==>
Möchten Sie darauf hinweisen, dass etwas nicht für die öffentliche Nutzung, aber es sollte wirken wie
protected
verwenden_
.Wenn Sie möchten, um anzuzeigen, dass etwas ist nicht für die öffentliche Nutzung, aber es sollte wirken wie
private
verwenden__
.Dies ist auch ein Zitat, dass ich mag sehr viel:
Aber das problem ist meiner Meinung nach, dass wenn es keine IDE, die Sie warnt, wenn Sie überschreiben die Methoden, Suche nach dem Fehler könnte eine Weile dauern, wenn Sie versehentlich überschrieben eine Methode aus einer Basisklasse.
InformationsquelleAutor der Antwort