Python nos dá a capacidade de criar métodos 'privados' e variáveis dentro de uma classe, antecedendo sublinhados duplos para o nome, assim: __myPrivateMethod()
. Como, então, alguém pode explicar isso?
>>> 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!!
Qual é o problema ?!
Vou explicar isso um pouco para quem não entendeu direito.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
O que eu fiz lá é criar uma classe com um método público e um método privado e instancia-lo.
Em seguida, chamo seu método público.
>>> obj.myPublicMethod()
public method
Em seguida, tento chamar seu método privado.
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
Tudo parece bom aqui; não podemos chamá-lo. É, de fato, "privado". Bem, na verdade não é. A execução de dir () no objeto revela um novo método mágico que o python cria magicamente para todos os seus métodos 'particulares'.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
O nome desse novo método é sempre um sublinhado, seguido pelo nome da classe, seguido pelo nome do método.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Tanta coisa para encapsulamento, não é?
De qualquer forma, sempre ouvi dizer que o Python não suporta encapsulamento, então por que tentar? O que da?