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