Python nos da la capacidad de crear métodos 'privados' y variables dentro de una clase anteponiendo doble subrayado al nombre, así: __myPrivateMethod()
. ¿Cómo, entonces, se puede explicar esto?
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
¡¿Cual es el trato?!
Explicaré esto un poco para aquellos que no lo entendieron.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Lo que hice allí fue crear una clase con un método público y un método privado e instanciarlo.
A continuación, llamo a su método público.
>>> obj.myPublicMethod()
public method
A continuación, intento llamar a su método privado.
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
Todo se ve bien aquí; No podemos llamarlo. Es, de hecho, 'privado'. Bueno, en realidad no lo es. Ejecutar dir () en el objeto revela un nuevo método mágico que Python crea mágicamente para todos sus métodos 'privados'.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
El nombre de este nuevo método siempre es un guión bajo, seguido del nombre de la clase, seguido del nombre del método.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Demasiado encapsulado, ¿eh?
En cualquier caso, siempre escuché que Python no admite la encapsulación, entonces, ¿por qué intentarlo? ¿Lo que da?