Python nous donne la possibilité de créer des "privés" des méthodes et des variables au sein d'une classe en ajoutant le double des traits de soulignement pour le nom, comme ceci: __myPrivateMethod()
. Alors, comment peut-on expliquer cette
>>> 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 vous expliquer un peu pour ceux qui n'ont pas tout à fait qu'.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Ce que j'ai fait ici est de créer une classe avec une méthode publique et privée, de la méthode et de l'instancier.
Ensuite, j'ai appeler sa méthode publique.
>>> obj.myPublicMethod()
public method
Ensuite, j'essaie de l'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 bon ici; nous ne sommes pas en mesure pour l'appeler. Il est, en fait, le "privé". Eh bien, en fait il ne l'est pas. L'exécution de dir() sur l'objet révèle une nouvelle méthode magique que python crée comme par magie pour toutes vos "privé" des méthodes.
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Cette nouvelle méthode est le nom est toujours un trait de soulignement, suivi par le nom de la classe, suivie par le nom de la méthode.
>>> obj._MyClass__myPrivateMethod()
this is private!!
Autant pour l'encapsulation, hein?
En tout cas, j'avais toujours entendu dire que Python ne prend pas en charge l'encapsulation, alors pourquoi même essayer? Ce qui donne?