155 Stimmen

Sollte ich in Python die Namensverwirrung verwenden?

In anderen Sprachen lautet eine allgemeine Richtlinie, die zur Erzeugung von besserem Code beiträgt, immer alles so versteckt wie möglich zu machen. Wenn Sie sich unsicher sind, ob eine Variable privat oder geschützt sein sollte, ist es besser, sie privat zu verwenden.

Gilt das Gleiche auch für Python? Sollte ich zuerst bei allem zwei führende Unterstriche verwenden und sie nur weniger versteckt machen (nur ein Unterstrich), wenn ich sie brauche?

Wenn die Konvention nur einen Unterstrich zu verwenden ist, würde ich auch gerne den Grund dafür wissen.

Hier ist ein Kommentar, den ich zu JBernardos Antwort hinterlassen habe. Es erläutert, warum ich diese Frage gestellt habe und auch warum ich wissen möchte, warum Python sich von den anderen Sprachen unterscheidet:

Ich komme aus Sprachen, die dich dazu erziehen, zu denken, dass alles nur so öffentlich sein sollte, wie nötig und nicht mehr. Der Grundgedanke ist, dass dies die Abhängigkeiten reduzieren und den Code sicherer machen wird. Die Python-Methode, die Dinge umzukehren - von öffentlich zu versteckt zu gehen - ist für mich seltsam.

5voto

JBernardo Punkte 30924

Erstens: Warum möchten Sie Ihre Daten verstecken? Warum ist das so wichtig?

Die meiste Zeit möchten Sie es nicht wirklich tun, aber Sie tun es, weil es andere tun.

Wenn Sie wirklich wirklich wirklich nicht möchten, dass andere etwas verwenden, fügen Sie ein Unterstrich vor es hinzu. Das ist alles... Pythonistas wissen, dass Dinge mit einem Unterstrich nicht garantiert jedes Mal funktionieren und sich möglicherweise ändern, ohne dass Sie es wissen.

Das ist die Art, wie wir leben und wir sind okay damit.

Die Verwendung von zwei Unterstrichen macht Ihre Klasse so schlecht zum Unterbinden, dass sogar Sie nicht auf diese Weise arbeiten möchten.

5voto

Tanner_Wauchope Punkte 78

Die ausgewählte Antwort erklärt gut, wie Eigenschaften die Notwendigkeit von privaten Attributen beseitigen, aber ich würde auch hinzufügen, dass Funktionen auf Modulebene die Notwendigkeit von privaten Methoden beseitigen.

Wenn Sie eine Methode in eine Funktion auf Modulebene umwandeln, beseitigen Sie die Möglichkeit, dass Unterklassen sie überschreiben. Das Verschieben einiger Funktionen auf die Modulebene ist eher Pythonisch als der Versuch, Methoden mit Namensverdeckung zu verstecken.

5voto

Nitish Chauhan Punkte 335

Der folgende Code-Ausschnitt erläutert alle verschiedenen Fälle :

  • Zwei führende Unterstriche (__a)
  • Ein einzelner führender Unterstrich (_a)
  • Kein Unterstrich (a)

    class Test:
    
    def __init__(self):
        self.__a = 'test1'
        self._a = 'test2'
        self.a = 'test3'
    
    def change_value(self,value):
        self.__a = value
        return self.__a

Ausgabe aller gültigen Attribute des Test-Objekts

testObj1 = Test()
gültige_attribute = dir(testObj1)
print gültige_attribute

['_Test__a', '__doc__', '__init__', '__module__', '_a', 'a', 
'change_value']

Hier sehen Sie, dass der Name __a in _Test__a geändert wurde, um zu verhindern, dass diese Variable von einer Unterklasse überschrieben wird. Dieses Konzept ist als "Name Mangling" in Python bekannt. Sie können darauf so zugreifen :

testObj2 = Test()
print testObj2._Test__a

test1

Ebenso wird bei _a nur der Entwickler darüber informiert, dass es als interne Variable dieser Klasse verwendet werden sollte. Der Python-Interpreter tut nichts, auch wenn Sie darauf zugreifen, aber es ist keine gute Praxis.

testObj3 = Test()
print testObj3._a

test2

Eine Variable kann aus jedem Ort abgerufen werden, sie ist wie eine öffentliche Klassenvariable.

testObj4 = Test()
print testObj4.a

test3

Hoffentlich hat Ihnen die Antwort geholfen :)

2voto

Roman Bodnarchuk Punkte 27769

Auf den ersten Blick sollte es das Gleiche sein wie bei anderen Sprachen (unter "anderen" meine ich Java oder C++), aber das ist es nicht.

In Java hast du alle Variablen privat gemacht, die außerhalb nicht zugänglich sein sollten. Gleichzeitig kannst du das in Python nicht erreichen, da es keine "Privatsphäre" gibt (wie einer der Python-Prinzipien besagt - "Wir sind alle Erwachsene"). Daher bedeutet doppeltes Unterstrich nur "Leute, verwendet dieses Feld nicht direkt". Gleiches gilt für ein einzelnes Unterstrich, der gleichzeitig keine Kopfschmerzen verursacht, wenn du von der betrachteten Klasse erben musst (nur ein Beispiel für ein mögliches Problem, das durch doppeltes Unterstrich verursacht wird).

Also empfehle ich dir, standardmäßig ein einzelnes Unterstrich für "private" Member zu verwenden.

2voto

Yaroslav Nikitenko Punkte 1543

"Wenn Sie sich unsicher sind, ob eine Variable privat oder geschützt sein sollte, ist es besser, privat zu wählen." - Ja, das gilt auch in Python.

Einige Antworten hier sprechen von 'Konventionen', geben aber keine Links zu diesen Konventionen. Der maßgebliche Leitfaden für Python, PEP 8, besagt ausdrücklich:

Wenn Sie unsicher sind, wählen Sie nicht-öffentlich; es ist einfacher, es später öffentlich zu machen als ein öffentliches Attribut nicht-öffentlich zu machen.

Der Unterschied zwischen öffentlich und privat und das Name Mangling in Python wurden in anderen Antworten berücksichtigt. Aus demselben Link:

Wir verwenden den Begriff "privat" hier nicht, da in Python kein Attribut wirklich privat ist (ohne eine im Allgemeinen unnötige Menge Arbeit).

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