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.
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 –