una metodo llamar instanciar instancia ejemplos ejemplo definir como clases clase atributos python private private-members private-methods

metodo - Variables privadas y métodos en Python



python ejemplo clases (4)

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

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


Doble guion bajo Eso destroza el nombre. Aún se puede acceder a la variable, pero generalmente es una mala idea hacerlo.

Use guiones bajos sencillos para semiprivado (le dice a los desarrolladores de Python "solo cambie esto si es absolutamente necesario") y dobla para totalmente privado.


El guion bajo doble Destruye el nombre de tal manera que no se puede acceder simplemente a través de __fieldName desde fuera de la clase, que es lo que desea comenzar si van a ser 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 TOCES", que es mejor que nada.


Porque esa es la convención de codificación. Mira PEP-8 para más.


Tenga en cuenta que no existe el "método privado" en Python. El guion bajo doble es solo el nombre de manipulació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 se produzca el cambio, por ejemplo, para no entrar en conflicto con los nombres que están arriba o debajo de la cadena de herencia. Para otros usos, el guión bajo individual sería mejor, en mi humilde opinión.

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

Si su clase está destinada a ser subclasificada, y tiene atributos que no quiere que usen las subclases, considere nombrarlos con guiones bajos dobles y sin guiones bajos posteriores. Esto invoca el algoritmo de manipulación de nombre de Python, donde el nombre de la clase se destroza en el nombre del atributo. Esto ayuda a evitar colisiones de nombres de atributos si las subclases contienen inadvertidamente atributos con el mismo nombre.

Nota 3: No a todos les gusta el cambio de nombre. Trate de equilibrar la necesidad de evitar conflictos de nombres accidentales con el uso potencial por parte de los llamadores avanzados.

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