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?
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).
Respuestas:
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_attr
cambiará de nombre_MyClass__some_attr
internamente, 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).fuente
__some_attr
que no se hará referencia alguna fuera de la clase? ¿No estaría bien usar doble guión bajo?