Variables y métodos privados en Python

Posible duplicado:
El significado de un subrayado simple y doble antes del nombre de un objeto en Python

¿Qué debo usar _foo (un guión bajo) o __bar (guión bajo) para miembros y métodos privados en Python?

Tenga en cuenta que no hay tal cosa como “método privado” en Python. El subrayado doble es sólo el nombre de la mutilación:

>>> class A(object): ... def __foo(self): ... pass ... >>> a = A() >>> A.__dict__.keys() ['__dict__', '_A__foo', '__module__', '__weakref__', '__doc__'] >>> a._A__foo() 

Por lo tanto, el __ prefijo es útil cuando necesita que ocurra la mutilación, por ejemplo, para no chocar con los nombres por encima o por debajo de la cadena de herencia. Para otros usos, un guión bajo sería mejor, en mi humilde opinión.

EDIT, con respecto a la confusión en __ , PEP-8 es bastante claro al respecto:

Si su clase está diseñada para ser subclasificada y tiene atributos que no desea que usen las subclases, considere nombrarlos con guiones bajos dobles y sin guiones bajos. Esto invoca el algoritmo de manipulación de nombres de Python, donde el nombre de la clase se transforma en el nombre del atributo. Esto ayuda a evitar colisiones de nombres de atributos en caso de que las subclases contengan inadvertidamente atributos con el mismo nombre.

Nota 3: No a todo el mundo le gusta la manipulación de nombres. Intente equilibrar la necesidad de evitar choques accidentales de nombres con el uso potencial por parte de llamantes avanzados.

Entonces, si no espera que la subclase vuelva a definir accidentalmente el método propio con el mismo nombre, no lo use.

El doble guión bajo. Maneja el nombre de tal manera que no se puede acceder a él simplemente a través de __fieldName desde fuera de la clase, que es lo que desea comenzar si son privados. (Aunque todavía no es muy difícil acceder al campo).

 class Foo: def __init__(self): self.__privateField = 4; print self.__privateField # yields 4 no problem foo = Foo() foo.__privateField # AttributeError: Foo instance has no attribute '__privateField' 

Será accesible a través de _Foo__privateField en _Foo__privateField lugar. Pero grita “SOY PRIVADO, NO ME TOQUE”, lo cual es mejor que nada.

Doble guión bajo. Que mancha el nombre. Aún se puede acceder a la variable, pero generalmente es una mala idea hacerlo.

Use guiones bajos simples para semiprivados (los desarrolladores de Python “solo cambian esto si es absolutamente necesario”) y se duplica para ser completamente privado.

Porque eso es la convención de encoding. Vea aquí para más.