Python nous donne la possibilité de créer des méthodes et des variables « privées » au sein d' une classe par préfixer doubles underscores au nom, comme celui - ci: __myPrivateMethod()
. Comment alors expliquer cela
>>> 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!!
Quel est le problème?!
Je vais l'expliquer un peu à ceux qui ne l'ont pas bien compris.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Ce que j'ai fait là-bas, c'est créer une classe avec une méthode publique et une méthode privée et l'instancier.
Ensuite, j'appelle sa méthode publique.
>>> obj.myPublicMethod()
public method
Ensuite, j'essaie d'appeler sa méthode privée.
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
Tout semble bien ici; nous ne pouvons pas l'appeler. C'est, en fait, «privé». Eh bien, ce n'est pas le cas. L'exécution de dir () sur l'objet révèle une nouvelle méthode magique que python crée par magie pour toutes vos méthodes «privées».
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Le nom de cette nouvelle méthode est toujours un trait de soulignement, suivi du nom de la classe, suivi du nom de la méthode.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Voilà pour l'encapsulation, hein?
Dans tous les cas, j'avais toujours entendu dire que Python ne supportait pas l'encapsulation, alors pourquoi même essayer? Ce qui donne?