Cuándo usar métodos privados en Python

9

Tengo una clase, pero cada método debe ser privado (aparte de la forma __init__y __str__). ¿Debo denotar cada método con un doble guión bajo, o se considera una mala práctica?


fuente
Escuché que cualquier cosa en Python es pública, y debe organizarse, cuándo usarlos. No estoy realmente en la parte avanzada de la OO, pero esto es lo que me queda en mente al respecto.
dragones
2
Solo para su información, el cambio de nombre está diseñado para evitar colisiones con nombres de uso común, no por privacidad.
detly
Para precisar la respuesta de @detly: no "nombres comúnmente usados", sino nombres usados ​​en subclases. "Dado que existe un caso de uso válido para los miembros privados de la clase (es decir, para evitar conflictos de nombres con nombres definidos por subclases), existe un soporte limitado para dicho mecanismo, denominado cambio de nombre". docs.python.org/3/tutorial/classes.html#private-variables Para evitar la colisión con un nombre incorporado, se utiliza un guión bajo (lista_).
Yaroslav Nikitenko

Respuestas:

16

Los verdaderos métodos privados, aquellos que no se pueden ver o usar desde fuera de una clase, no existen en Python. Lo que tenemos son convenciones que son meramente sugerencias para no tocar cosas que no deberías.

Lo más cercano a la privacidad es el cambio de nombre. Un atributo de MyClass nombrado se __some_attrcambiará de nombre _MyClass__some_attrinternamente, lo que hace que sea un poco incómodo hacer referencia a él desde fuera de la clase. Esto rara vez se usa. Lo que la mayoría de la gente hace es simplemente prefijar un solo guión bajo ( _attr) como una notación de que algo no se debe confiar y no es parte de la interfaz pública.

El uso de guiones bajos dobles antes y después del identificador, aunque no está prohibido, se considera reservado para los detalles del idioma interno (como los métodos 'mágicos'). No deberías andar __attr__buscando nuevos s (a menos que estés pirateando al intérprete).

Sean McSomething
fuente
10
Estas pautas están documentadas en Pep 8 .
Brian
¿Qué pasa con los casos en los __some_attrque no se hará referencia alguna fuera de la clase? ¿No estaría bien usar doble guión bajo?
Fermi paradoja
@ user5061 - técnicamente un uso correcto pero mal visto. Hace que la introspección sea más difícil.
Sean McSomething