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"

2voto

Ini Punkte 401

Die Fakten von _ und __ zu ermitteln ist ziemlich einfach; die anderen Antworten drücken sie ziemlich gut aus. Die Verwendung ist viel schwieriger zu bestimmen.

Ich sehe das folgendermaßen:

_

Sollte verwendet werden, um anzuzeigen, dass eine Funktion nicht für die Öffentlichkeit bestimmt ist, z. B. eine API. Dadurch und durch die Importbeschränkung verhält es sich ähnlich wie internal in c#.

__

Sollte verwendet werden, um Namenskollisionen in der Vererbungshierarchie zu vermeiden und um Latebinding zu verhindern. Ähnlich wie private in c#.

\==>

Wenn Sie angeben möchten, dass etwas nicht für den öffentlichen Gebrauch bestimmt ist, es sich aber wie protected utilice _ . Wenn Sie darauf hinweisen wollen, dass etwas nicht für die Öffentlichkeit bestimmt ist, es sich aber so verhalten soll private utilice __ .

Das ist auch ein Zitat, das ich sehr mag:

Das Problem besteht darin, dass der Autor einer Klasse berechtigterweise der Meinung sein kann, "dieses Attribut/Methodenname sollte privat sein, nur zugänglich innerhalb dieser dieser Klassendefinition zugänglich sein" und die Konvention __private verwenden. Aber später kann ein Benutzer dieser Klasse eine Unterklasse erstellen, die berechtigterweise Zugriff auf diesen Namen benötigt. Also muss entweder die Oberklasse geändert werden (was schwierig oder unmöglich sein kann), oder der Code der Unterklasse muss manuell veränderte Namen verwenden (was im besten Fall hässlich und anfällig ist).

Aber das Problem dabei ist meiner Meinung nach, dass wenn es keine IDE gibt, die einen warnt, wenn man Methoden überschreibt, es eine Weile dauern kann, den Fehler zu finden, wenn man versehentlich eine Methode aus einer Basisklasse überschrieben hat.

0voto

Timothy C. Quinn Punkte 2697

Im Falle von Methoden können Sie den doppelten Unterstrich verwenden, um private "Methoden" nach folgendem Muster zu verbergen:

# Private methods of MyClass
def _MyClass__do_something(obj:'MyClass'):
    print('_MyClass__do_something() called. type(obj) = {}'.format(type(obj)))

class MyClass():
    def __init__(self):
        __do_something(self)

mc = MyClass()

Ausgabe:

_MyClass__do_something() called. type(obj) = <class '__main__.MyClass'>

Ich bin heute darüber gestolpert, als ich versucht habe, doppelte Unterstriche für Klassenmethoden zu verwenden und die folgende Meldung erhielt NameError: name '_<class><method>' is not defined Fehler.

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