Variables de instancia: continuación
Observa el ejemplo modificado en el editor.
Es casi lo mismo que el anterior. La única diferencia está en los nombres de las propiedades. Hemos agregado dos guiones bajos (__
) en frente de ellos.
Como sabes, tal adición hace que la variable de instancia sea privada - se vuelve inaccesible desde el mundo exterior.
El comportamiento real de estos nombres es un poco más complicado, así que ejecutemos el programa. Esta es la salida:
{'_ClaseEjemplo__primera': 1}
{'_ClaseEjemplo__primera': 2, '_ClaseEjemplo__segunda': 3}
{'_ClaseEjemplo__primera': 4, '__tercera': 5}
¿Puedes ver estos nombres extraños llenos de guiones bajos? ¿De dónde provienen?
Cuando Python ve que deseas agregar una variable de instancia a un objeto y lo vas a hacer dentro de cualquiera de los métodos del objeto, maneja la operación de la siguiente manera:
- Coloca un nombre de clase antes de tu nombre.
- Coloca un guión bajo adicional al principio.
Es por ello que __primera
se convierte en _ClaseEjemplo__primera
.
El nombre ahora es completamente accesible desde fuera de la clase. Puedes ejecutar un código como este:
print(objetoEjemplo1._ClaseEjemplo__primera)
y obtendrás un resultado válido sin errores ni excepciones.
Como puedes ver, hacer que una propiedad sea privada es limitado.
No funcionará si agregas una variable de instancia fuera del código de clase. En este caso, se comportará como cualquier otra propiedad ordinaria.
Code
class ClaseEjemplo:def __init__(self, val = 1):
self.__primera = val
def setSegunda(self, val):
self.__segunda = val
objetoEjemplo1 = ClaseEjemplo()
objetoEjemplo2 = ClaseEjemplo(2)
objetoEjemplo2.setSegunda(3)
objetoEjemplo3 = ClaseEjemplo(4)
objetoEjemplo3.__tercera = 5
print(objetoEjemplo1.__dict__)
print(objetoEjemplo2.__dict__)
print(objetoEjemplo3.__dict__)