2010-07-20 15 views
5

Duplicar posible:
private members in pythonsimular variables privadas en Python

Tengo pocas variables que realmente desea ocultar porque no pertenecen fuera de mi clase. Además, todas estas variables no documentadas hacen que la herencia sea inútil.

¿Cómo se ocultan las variables que no desea mostrar fuera de su objeto?

Para aclarar por qué necesito variables privadas, primero un ejemplo donde la incapacidad para ocultar las variables es sólo un inconveniente, y luego otro que es realmente un problema:

class MyObject(object): 
    def __init__(self, length): 
     self.length = length 
    def __len__(self): 
     return length 

item = MyObject(5) 
item.length 
len(item) 

así que tengo dos maneras de acceder 'de largo 'del artículo aquí. Es solo un inconveniente y nada horrible.

from wares import ImplementationSpecific 

class MyThing(object): 
    def __init__(self): 
     self.__no_access_even_if_useful = ImplementationSpecific() 
    def restricted_access(self): 
     return self.__no_access_even_if_useful.mutable_value 

thing = MyThing() 
thing.restricted_access() 
thing._MyThing__no_access_even_if_useful.something_useful_for_someone() 

Así que decir que quiero cambiar la implementación algún día .. Lo más probable es que va a romper algo menos que realmente he enterrado los detalles de implementación.

Lo tomaré como cualquiera podría programar. Ese 'cualquiera' puede encontrar algo útil a partir de mis detalles de implementación y usarlo, ¡incluso si hubiera sido muy desaconsejable hacerlo! Sería mucho más fácil decir: "no, no está allí, prueba otra cosa".

+1

¿Desea que las variables no hereden, correcto? –

+1

Paul: corregir .. – Cheery

+7

Python no hace la esclavitud y la dominación como lo hacen algunos idiomas. Si no puede evitar el uso de '_method' o' _datum' (vea DrDee a continuación), se merece lo que obtiene (o no obtiene (o se rompe)). – msw

Respuesta

14

Las variables privadas están cubiertos en el pitón documentation:

9,6. Variables privadas

Las variables de instancia "privadas" a las que no se puede acceder, excepto desde dentro 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.

Resumen: use un guión bajo antes del nombre.

11

Desde el Python docs:

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.

+0

mmmmmm 20 segundos demasiado tarde :) – DrDee

+0

Estoy bastante seguro de que el Sr. Byers vive en un universo alternativo unos 10 segundos antes que el nuestro. ;) – msw

+0

interesante, metafísica en el trabajo ya que Byers respondió la pregunta antes que yo ... – DrDee

Cuestiones relacionadas