1859 Stimmen

Welche Bedeutung haben einfache und doppelte Unterstriche vor einem Objektnamen?

Kann jemand bitte erklären, die genaue Bedeutung der mit einfachen und doppelten führenden Unterstrichen vor einem Objektnamen in Python, und der Unterschied zwischen beiden?

Bleibt diese Bedeutung auch gleich, unabhängig davon, ob es sich bei dem betreffenden Objekt um eine Variable, eine Funktion, eine Methode usw. handelt?

6 Stimmen

Eine tolle kurze Antwort aus einem anderen Thread: stackoverflow.com/a/8689983/911945

1 Stimmen

Siehe auch dies ausgezeichnet Hier finden Sie eine Antwort auf die Frage nach einfachen und doppelten Unterstrichen und eine Demonstration der "Namensverwechslung"! Antwort auf "Private Mitglieder in Python"

8voto

grepit Punkte 18534

Ich habe ein einfaches Beispiel zusammen mit einer einfachen Definition/Bedeutung angegeben.

Bedeutung:

some_variable -- es ist öffentlich, jeder kann es sehen.

_some_variable -- es ist öffentlich, jeder kann es sehen, aber es ist eine Konvention, um privat anzuzeigen... Warnung Die Durchsetzung erfolgt nicht durch Python.

__some_varaible -- Python ersetzt den Variablennamen durch _classname__some_varaible (AKA name mangling) und es reduziert/versteckt seine Sichtbarkeit und ist mehr wie eine private Variable.

Nur um hier ehrlich zu sein Gemäß der Python-Dokumentation

""Private" Instanzvariablen, auf die nur von einem Objekt aus zugegriffen werden kann innerhalb eines Objekts zugreifen können, gibt es in Python nicht.

Das Beispiel:

class A():
    here="abc"
    _here="_abc"
    __here="__abc"

aObject=A()
print(aObject.here) 
print(aObject._here)
# now if we try to print __here then it will fail because it's not public variable 
#print(aObject.__here)

0 Stimmen

_ _einige_varaible -- .... und es reduziert/versteckt seine Sichtbarkeit und ist mehr wie eine private Variable. Nein, es geht darum, den Namen zu verfälschen, nicht darum, die Methode zu verbergen.

7voto

Marc Punkte 3685

Hier ist ein einfaches Beispiel dafür, wie doppelte Unterstreichungseigenschaften eine geerbte Klasse beeinflussen können. Also mit dem folgenden Aufbau:

class parent(object):
    __default = "parent"
    def __init__(self, name=None):
        self.default = name or self.__default

    @property
    def default(self):
        return self.__default

    @default.setter
    def default(self, value):
        self.__default = value

class child(parent):
    __default = "child"

Wenn Sie dann eine Child-Instanz in der Python REPL erstellen, sehen Sie folgendes

child_a = child()
child_a.default            # 'parent'
child_a._child__default    # 'child'
child_a._parent__default   # 'parent'

child_b = child("orphan")
## this will show 
child_b.default            # 'orphan'
child_a._child__default    # 'child'
child_a._parent__default   # 'orphan'

Das mag für einige offensichtlich sein, aber mich hat es in einem viel komplexeren Umfeld überrascht

6voto

SilentGhost Punkte 285785

Einzelne führende Unterstriche sind eine Konvention. Aus Sicht des Interpreters macht es keinen Unterschied, ob Namen mit einem einzelnen Unterstrich beginnen oder nicht.

Doppelte führende und nachgestellte Unterstriche werden für eingebaute Methoden verwendet, wie z. B. __init__ , __bool__ , usw.

Doppelte führende Unterstriche ohne nachgestellte Gegenstriche sind ebenfalls eine Konvention, allerdings werden die Klassenmethoden verstümmelt durch den Dolmetscher. Bei Variablen oder Basisfunktionsnamen besteht kein Unterschied.

4voto

u0b34a0f6ae Punkte 45029

Ihre Frage ist gut, es geht nicht nur um Methoden. Funktionen und Objekte in Modulen werden üblicherweise mit einem Unterstrich vorangestellt, können aber auch mit zwei vorangestellt werden.

Aber __double_underscore-Namen werden z.B. in Modulen nicht vermischt. Was passiert, ist, dass Namen, die mit einem (oder mehreren) Unterstrichen beginnen, nicht importiert werden, wenn Sie alle aus einem Modul importieren (from module import *), noch werden die Namen in help(module) angezeigt.

1 Stimmen

Außerdem verhalten sich Namen, die mit einem oder mehreren Unterstrichen beginnen und zwei oder mehr nachgestellte Unterstriche haben, wieder wie jeder andere Name.

3voto

aptro Punkte 51

"Private" Instanzvariablen, auf die nur innerhalb eines Objekts zugegriffen werden kann, gibt es in Python nicht. Es gibt jedoch eine Konvention, die von den meisten Python-Codes befolgt wird: Ein Name, dem ein Unterstrich vorangestellt ist (z. B. _spam), sollte als nicht-öffentlicher Teil der API behandelt werden (unabhängig davon, ob es sich um eine Funktion, eine Methode oder ein Datenelement handelt). Er sollte als ein Implementierungsdetail betrachtet werden und kann ohne Vorankündigung geändert werden.

Referenz https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references

1 Stimmen

_ ist viel ähnlicher zu zum Beispiel intern in c# als zu privat. Doppelte Unterstrich es viel mehr ähnlich wie private dann Unterstrich ist zu privaten würde ich sagen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X