Pregunta

Una de las cosas realmente buenas de python es la simplicidad con la que puedes nombrar variables que tienen el mismo nombre que el descriptor de acceso:

self.__value = 1

def value():
    return self.__value

¿Existe una forma sencilla de proporcionar acceso a los miembros privados de una clase que deseo subclasificar? A menudo, deseo simplemente trabajar con los objetos de datos sin procesar dentro de una clase sin tener que usar accesores y mutadores todo el tiempo.

Sé que esto parece ir en contra de la idea general de privado y público, pero generalmente la clase que estoy tratando de subclasificar es una de las mías, con la cual estoy muy contento de exponer a los miembros a una subclase pero no a una instancia de esa clase. ¿Hay una forma limpia de proporcionar esta distinción?

¿Fue útil?

Solución

No convenientemente, sin romper la encapsulación. El atributo de doble guión bajo se maneja por el nombre antes de '_ClassName' para la clase a la que se accede. Por lo tanto, si tiene una clase 'ContainerThing' que tiene un atributo '__value', el atributo realmente se almacena como '< código> _ContainerThing__value '. Cambiar el nombre de la clase (o refactorizar donde se asigna el atributo) significaría romper todas las subclases que intentan acceder a ese atributo.

Esta es exactamente la razón por la que el uso de nombres con subrayado doble (que no es realmente "privado", simplemente "inconveniente") es una mala idea de usar. Solo usa un guión bajo que indique single . Todos sabrán que no deben tocar su atributo 'privado' y aún podrá acceder a él en subclases y otras situaciones en las que sea muy útil. La combinación de nombres de los atributos de subrayado doble es útil solo para evitar conflictos de nombres para atributos que son verdaderamente específicos de una clase en particular, lo cual es extremadamente raro. No proporciona ninguna "seguridad" adicional, ya que incluso los atributos con nombres modificados son trivialmente accesibles.

Para el registro, ' __value ' y ' value ' (y ' _value ') no son el mismo nombre. Los guiones bajos son parte del nombre.

Otros consejos

" Sé que esto parece ir en contra de la idea general de privado y público " No realmente "contra", simplemente diferente de C ++ y Java.

Privado: como se implementó en C ++ y Java no es un concepto muy útil. Ayuda, a veces, a aislar los detalles de la implementación. Pero está muy usado en exceso.

Los

nombres de Python que comienzan con dos __ son especiales y no debes, como algo normal, definir atributos con nombres como este. Los nombres con __ son especiales y forman parte de la implementación. Y expuesto para su uso.

Los nombres que comienzan con un _ son " privados " ;. A veces se ocultan, un poco. La mayoría de las veces, los " adultos que consienten " se aplica la regla: no los use tontamente, están sujetos a cambios sin previo aviso.

Ponemos " privado " entre comillas porque es solo un acuerdo entre usted y sus usuarios. Has marcado cosas con _ . Sus usuarios (y usted) deben honrar eso.

A menudo, tenemos nombres de funciones de método con un _ inicial para indicar que consideramos que son " privados " y sujeto a cambios sin previo aviso.

Los interminables captadores y definidores que Java requiere no se usan tan frecuentemente en Python. La introspección de Python es más flexible, tiene acceso al diccionario interno de valores de atributos de un objeto y tiene la primera clase funciones como getattr () y setattr () .

Además, tiene la función property () que a menudo se usa para vincular a los captadores y definidores a un solo nombre que se comporta como un atributo simple, pero en realidad es una función de método bien definida. / p>

No estoy seguro de dónde citarlo, pero la siguiente declaración con respecto a la protección de acceso es el Canon Pythonic: " Todos aceptamos adultos aquí " ;.

Tal como lo ha declarado Thomas Wouters, un solo guión bajo es la forma idiomática de marcar un atributo como parte del estado interno del objeto. Dos guiones bajos simplemente proporcionan nombres para evitar el acceso fácil al atributo.

Después de eso, debes esperar que el cliente de tu biblioteca no se dispare a sí mismo al meterse con el " private " atributos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top