2011-10-05 18 views
5

Recientemente publiqué a question en stackoverflow y obtuve una resolución.¿Cuál es la manera Pythonic de usar variables privadas?

Alguien me sugirió sobre el estilo de codificación y no he recibido más información. Tengo la siguiente pregunta con referencia a la consulta anterior.

  1. ¿Cómo podemos declarar las variables privadas dentro de una clase en python? Pensé que al usar un guión bajo doble (__) la variable se trata como privada. Por favor corrigeme.

  2. Según la sugerencia recibida anteriormente, no tenemos que usar un método getter o setter. ¿No deberíamos usar un getter o setter o ambos? Por favor, hágame saber su sugerencia sobre este.

+1

La respuesta a # 1 es, no hay verdaderas variables privadas en Python. Ver: [este] (http://stackoverflow.com/questions/70528/why-are-pythons-private-methods-not-actually-private) y [este] (http://stackoverflow.com/questions/7456638/true-privateness-in-python/7456669 # 7456669) – NullUserException

+1

http://dirtsimple.org/2004/12/python-is-not-java.html – SingleNegationElimination

Respuesta

8

Todo es public en Python, el __ es una sugerencia, por convención, que no debe usar esa función, ya que es un detalle de implementación.

Esto no se aplica por el lenguaje o el tiempo de ejecución de ninguna manera, estos nombres están decorados de una manera semi-ofuscada, pero todavía son public y aún son visibles para todos los códigos que intentan usarlos.

Idiomatic Python no usa los accesadores get/set, es una duplicación de esfuerzos ya que no hay alcance private.

Solo debe utilizar los descriptores de acceso cuando desee acceder indirectamente a una variable miembro para tener un código a su alrededor, y luego marque la variable miembro con __ como nombre de inicio y proporcione una función con el nombre real.

Puede hacer grandes esfuerzos escribiendo cantidades de código para tratar de proteger al usuario de sí mismo usando Descriptors y meta programación, pero al final obtendrá más código que es más para probar y más para mantener, y todavía no garantiza que las cosas malas no sucederán, no te preocupes, Python ha sobrevivido 20 años hasta el momento, por lo que no puede ser tan importante.

+0

Gracias Jarrod.Si no podemos asignar una variable privada, ¿cómo podemos hacer cumplir? las reglas como variable no deberían recibir valores inaceptables – techrawther

+0

No se puede aplicar realmente. Si quieren acceder a él, lo harán. El guion bajo doble simplemente trata de ofuscarlo con la forma en que genera la nomenclatura cuando observa los atributos externos a la clase – jdi

+0

. Hay algunas [técnicas de metaprogramación] (http://www.acooke.org/cute/PythonMeta0.html) que puede usar para interceptar accesos a variables miembro, pero sinceramente, en 15 años de programación Python nunca ha sido una molestia para mí, o para el resto del mundo realmente. –

0

las variables privadas:

Si se utiliza el doble subrayado al principio de los miembros de su clase que se consideran como privado, aunque no se hacen cumplir realmente por el pitón. Simplemente obtienen algunos nombres añadidos al frente para evitar que se les pueda acceder fácilmente. El guión bajo único podría tratarse como "protegido".

captador/definidor:

Puede utilizar estos si quieres hacer algo más para envolver el proceso y 'proteger' su 'privado' atributos. Pero es, de nuevo, no requerido. También puede usar Propiedades, que tiene características getter/setter.

0

1) http://docs.python.org/tutorial/classes.html#private-variables

variables de instancia “privado” que no se puede acceder a excepción del interior de un objeto no existen en Python. Sin embargo, hay una convención que es seguida por la mayoría del código de Python: un nombre prefijado con un guión bajo (por ejemplo, _spam) debe tratarse como una parte no pública de la API (ya sea una función, un método o un miembro de datos) . Se debe considerar un detalle de implementación y está sujeto a cambios sin previo aviso.

(seguir leyendo para más detalles acerca de las variables de clase-privadas y renombrado de nombres)

2) http://docs.python.org/library/functions.html#property

4

PEP 8 (http://www.python.org/dev/peps/pep-0008/) tiene una sección "Diseño de la herencia" que debe abordar la mayoría de estas preocupaciones

Para citar:

"Nosotros no usamos el término 'privado' aquí, ya que ningún atributo es realmente privada en Python (sin una cantidad innecesaria de trabajo en general)."

también:

"Si la clase está destinada a ser una subclase, y tiene atributos que no desee utilizar subclases, consideran nombrarlos con subrayados dobles que dan y no se arrastra subraya"

Si no ha leído toda la sección, le recomiendo que lo haga.

Actualización:

Para responder a la pregunta (ahora que el título ha cambiado). La forma pitónica de usar variables privadas es y no usan variables privadas. Tratar de ocultar algo en Python rara vez se ve como pitónico.

Cuestiones relacionadas