Wann werden private Methoden in Python verwendet?

9

Ich habe eine Klasse, aber jede Methode darin sollte privat sein (abgesehen von __init__und __str__). Sollte ich jede Methode mit einem doppelten Unterstrich kennzeichnen, oder wird dies als schlechte Praxis angesehen?


quelle
Ich höre, dass alles in Python öffentlich ist und Sie sich selbst organisieren sollten, wann Sie es verwenden sollen. Ich bin nicht wirklich in den fortgeschrittenen Teil der OO verliebt, aber das ist es, was mir darüber noch in den Sinn kommt.
Drachen
2
Nur zu Ihrer Information, Name Mangling wurde entwickelt, um Kollisionen mit häufig verwendeten Namen zu vermeiden, nicht aus Datenschutzgründen.
Detly
Um die Antwort von @detly zu präzisieren: Nicht "häufig verwendete Namen", sondern Namen, die in Unterklassen verwendet werden. "Da es einen gültigen Anwendungsfall für klassenprivate Mitglieder gibt (nämlich um Namenskonflikte von Namen mit Namen zu vermeiden, die durch Unterklassen definiert sind), gibt es eine begrenzte Unterstützung für einen solchen Mechanismus, der als Namensverwaltung bezeichnet wird." docs.python.org/3/tutorial/classes.html#private-variables Um eine Kollision mit einem eingebauten Namen zu vermeiden, wird ein abschließender Unterstrich (list_) verwendet.
Jaroslaw Nikitenko

Antworten:

16

Echte private Methoden - solche, die außerhalb einer Klasse nicht gesehen oder verwendet werden können - existieren in Python nicht. Was wir haben, sind Konventionen, die lediglich Vorschläge sind, Dinge nicht zu berühren, die Sie nicht berühren sollten.

Am nächsten an der Privatsphäre ist das Mangeln von Namen. Ein Attribut von MyClass __some_attrwird nur _MyClass__some_attrintern umbenannt , was es etwas umständlich macht, es von außerhalb der Klasse zu referenzieren. Dies wird selten verwendet. Was die meisten Leute tun, ist einfach einen einzelnen Unterstrich ( _attr) als Präfix voranzustellen, auf das man sich nicht verlassen sollte und der nicht Teil der öffentlichen Schnittstelle ist.

Die Verwendung von doppelten Unterstrichen vor und nach dem Bezeichner ist zwar nicht verboten, wird jedoch für interne Sprachdetails reserviert (wie z. B. "magische" Methoden). Sie sollten sich keine neuen __attr__s einfallen lassen (es sei denn, Sie hacken den Dolmetscher).

Sean McSomething
quelle
10
Diese Richtlinien sind in Pep 8 dokumentiert .
Brian
Was ist mit Fällen, in denen __some_attraußerhalb der Klasse überhaupt nicht verwiesen wird? Wäre es nicht in Ordnung, einen doppelten führenden Unterstrich zu verwenden?
Fermi Paradox
@ user5061 - technisch eine korrekte Verwendung, aber verpönt. Es erschwert die Selbstbeobachtung.
Sean McSomething