2013-02-03 2 views
31

Mögliche Duplizieren:
The meaning of a single- and a double-underscore before an object name in PythonWas ist der Unterschied in Python ist Attribute mit Unterstrich vor und zurück

Ich möchte wissen, was der Unterschied zwischen diesen in Python ist

self._var1

self._var1_

self.__var1

self.__var1__

+2

Mögliche Duplikate: http://StackOverflow.com/Questions/1301346/the-beaning-of-a-Single-and-a-Double-Sunders-Before-An-Object-Na-in-Python und http: //stackoverflow.com/questions/935378/python-question-about-the-difference-beetween-method-and-method –

Antwort

56

Als Ausgangspunkt, werden Sie wahrscheinlich hilfreich, dieses Zitat von PEP 8 - Style Guide For Python Code finden:

Darüber hinaus sind die folgenden Sonderformen mit Vorder- oder Hinter Unterstrichen anerkannt (Diese können im Allgemeinen mit jeder Fallkonvention kombiniert werden):

_single_leading_underscore: schwacher Indikator für "interne Verwendung". Z.B. from M import * importiert keine Objekte, deren Name mit einem Unterstrich beginnt.

single_trailing_underscore_: Konvention verwendet, um Konflikte zu vermeiden mit Python-Schlüsselwort, z. Tkinter.Toplevel(master, class_='ClassName')

__double_leading_underscore: wenn ein Klassenattribut Namensgebung ruft Namen Mangeln (innen Klasse FooBar, __boo_FooBar__boo wird, siehe unten).

: "magische" Objekte oder Attribute, die in benutzergesteuerten Namespaces leben. Z.B. __init__, __import__ oder __file__. Erfinde niemals solche Namen; verwende sie nur wie dokumentiert.

fragte Sie im Rahmen der Klassenattribute, obwohl, so lassen Sie uns einen Blick auf Ihre speziellen Beispiele nehmen:

Einzelunterstrich

ein Attribut in der Klasse Naming self._var1 zeigt dem Benutzer an der die Klasse, auf die das Attribut nur von den Interna der Klasse (oder vielleicht denen einer Unterklasse) zugegriffen werden sollte und auf die sie nicht direkt zugreifen müssen und die sie wahrscheinlich nicht modifizieren sollten. Sie sollten führende Unterstriche an den gleichen Stellen verwenden, an denen Sie ein private oder protected-Feld in Java oder C# verwenden würden. Beachten Sie jedoch, dass die Sprache den Nicht-Zugriff nicht erzwingt. Stattdessen vertrauen Sie dem Benutzer Ihrer Klasse, nichts Dummes zu tun. und lassen Sie ihnen die Möglichkeit, auf das private Feld Ihrer Klasse zuzugreifen (oder sie zu ändern), wenn sie wirklich, wirklich sicher sind, dass sie wissen, was sie tun, und das macht Sinn.

Einzel Vorder- und Hinterstrich

self._var1_ ist nicht etwas, das ich je gesehen habe. Ich denke nicht, dass dieser Benennungsstil eine konventionelle Bedeutung in der Python-Welt hat.

Doppel führende unterstreichen

Dieser eigentlich syntaktische Bedeutung hat. Die Bezugnahme auf self.__var1 aus dem Bereich Ihrer Klasse ruft name mangling auf. Außerhalb der Klasse erscheint die Variable unter self._YourClassName__var1 anstelle von self.__var1. Nicht jeder benutzt das - wir sind überhaupt nicht dort, wo ich arbeite - und für einfache Klassen fühlt es sich an wie eine leicht absurde und irritierende Alternative zur Verwendung eines einzelnen führenden Unterstrichs.

Allerdings gibt es eine Rechtfertigung dafür vorhanden; Wenn Sie viel Vererbung verwenden, wenn Sie nur einzelne führende Unterstriche verwenden, haben Sie keine Möglichkeit, jemandem, der Ihren Code liest, den Unterschied zwischen "privaten" und "geschützten" Variablen - solchen, die nicht einmal gemeint sind - anzuzeigen auf die von Unterklassen zugegriffen werden soll, und auf die Unterklassen zugreifen können, aber die Außenwelt nicht. Das Verwenden eines einzelnen abschließenden Unterstrichs für "geschützt" und eines doppelten Unterstrichs für "privat" kann daher in dieser Situation eine nützliche Konvention sein (und der Name Mangling ermöglicht es Unterklassen, eine Variable mit demselben Namen in ihrer Unterklasse zu verwenden, ohne dies zu verursachen ein Zusammenstoß).

Doppel Vorder- und Hinterstrich

self.__var1__ ist etwas, das Sie sollten nie schaffen, wie ich buchstäblich es geschrieben habe, weil die Doppel Vorder- und Hinterstrich Namensgebung Stil gemeint ist, nur für Namen verwendet werden, die eine besondere Bedeutung haben definiert durch Python, wie die __init__ oder __eq__ Methoden der Klassen. Sie können diese überschreiben, um das Verhalten Ihrer Klasse zu ändern (tatsächlich haben fast alle Klassen einen Programmierer-definierten __init__), aber Sie sollten nicht Ihre eigenen Namen in diesem Stil wie self.__var1__ machen.

+0

Auch ausführlich in der [docs] (http://docs.python.org/2/reference/) lexical_analysis.html # reserved-class-of-identifiers). –

+1

"Einzelner führender und abschließender Unterstrich": Dies wird in einigen Projekten als Konvention für benutzerdefinierbare Sondermethodenäquivalente verwendet. Wir verwenden es zum Beispiel in [Sage] (http://www.sagemath.org/doc/developer/coding_in_python.html#special-sage-functions). Ich habe es auch woanders gesehen, obwohl ich mir kein Beispiel vorstellen kann. – DSM

+0

Die letzten drei Zeilen von ** Doppelte führende Unterstreichung ** sollte umgekehrt sein: Single Unterstrich = privat, Double Unterstrich = geschützt – amirteymuri

Verwandte Themen