5.9. Funciones privadas

Como muchos lenguajes, Python tiene el concepto de elementos privados:

Al contrario que en muchos otros lenguajes, la privacidad de una función, método o atributo de Python viene determinada completamente por su nombre.

Si el nombre de una función, método de clase o atributo en Python empieza con (pero no termina en) dos caracteres guión bajo (_), es privado; todo lo demás es público. Python no tiene concepto de métodos de clase protected (accesibles sólo desde su propia clase y descendientes). Los métodos de clase son privados (accesibles sólo desde su clase) o públicos (accesibles a cualquiera).

En MP3FileInfo, hay dos métodos: __parse y __setitem__. Como ya hemos hablado, __setitem__ es un método especial; normalmente, lo llamará de forma indirecta usando la sintaxis de diccionarios en una instancia de clase, pero es pública, y podría llamarla directamente (incluso desde fuera del módulo fileinfo) si tuviera una poderosa razón. Sin embargo, __parse es privada, porque tiene dos guiones bajos al principio de su nombre.

nota
En Python, todos los métodos especiales (como __setitem__) y atributos incorporados (como __doc__) siguen una convención estándar: empiezan y terminan con dos guiones bajos. No ponga a sus propios métodos ni atributos nombres así, porque sólo le confudirán a usted (y otros) más adelante.

Ejemplo 5.19. Intento de invocación a un método privado

>>> import fileinfo
>>> m = fileinfo.MP3FileInfo()
>>> m.__parse("/music/_singles/kairo.mp3") 1
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
1 Si intenta invocar a un método privado, Python lanzará una expresión un tanto confusa, diciendo que el método no existe. Por supuesto que existe, pero es privado, y por tanto no es accesible fuera de la clase.Hablando estrictamente, sí se puede acceder desde fuera de la clase a un método privado, sólo que no es fácil. Nada en Python es realmente privado; internamente, los nombres de los métodos y atributos privados se manipulan sobre la marcha para que parezca que son inaccesibles mediante sus nombres. Puede acceder al método __parse de MP3FileInfo mediante el nombre _MP3FileInfo__parse. Entienda esto como detalle interesante, pero prometa que nunca, nunca, lo hará en código de verdad. Los métodos privados lo son por alguna razón, pero como muchas otras cosas en Python, su privacidad es cuestión de convención, no forzada.

Lecturas complementarias sobre funciones privadas