723 votes

Pourquoi les Python ' s ' privée ' méthodes pas effectivement privés ?

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?

635voto

Alya Points 2106

Le nom de brouillage est utilisé pour garantir que les sous-classes n’accidentellement remplacer les méthodes privées et les attributs de leurs superclasses. Il n’a pas été conçu pour empêcher délibérément accès depuis l’extérieur.

Par exemple :

Bien sûr, il tombe en panne si deux classes ont le même nom.

214voto

arun Points 1079
<h3>Exemple de fonction privée<pre><code></code></pre></h3>

194voto

Thomas Ahle Points 10403

Quand je suis arrivé à partir de Java, Python, je détestais cela. Ça m'a fait peur à la mort.

Aujourd'hui, c'est peut-être la seule chose que j'aime le plus à propos de Python.

J'adore être sur une plate-forme, où les gens ont confiance les uns les autres et ne se sentent pas comme ils ont besoin pour construire impénétrable murs autour de leur code. Fortement encapsulé langues, si une API a un bug, et que vous avez compris ce qui ne va pas, vous pouvez toujours être incapable de travailler autour de cela parce que le besoin de la méthode est d'ordre privé. En Python, l'attitude est: "bien sûr". Si vous pensez que vous comprenez la situation, vous avez peut-être même de le lire, alors tout ce que nous pouvons dire, c'est "bonne chance!".

Rappelez-vous, l'encapsulation n'est pas encore faiblement liées à la "sécurité", ou à garder les enfants hors de la pelouse. Il est juste un autre motif qui doit être utilisé pour faire une base de code plus facile à comprendre.

150voto

xsl Points 7362

À partir de http://www.faqs.org/docs/diveintopython/fileinfo_private.html

Strictement parlant, les méthodes privées sont accessible à l'extérieur de leur classe, tout pas facilement accessible. Rien dans Python est vraiment privé; en interne, les noms de méthodes privées et les attributs sont déformés et unmangled à la volée afin de les faire paraître inaccessible par leurs prénoms. Vous peuvent accéder à l' __méthode d'analyse de la MP3FileInfo de la classe par le nom _MP3FileInfo__parse. Reconnaissez que c'est intéressant, alors la promesse de jamais, jamais le faire dans le code réel. Les méthodes privées sont en privé pour un raison, mais comme beaucoup d'autres choses dans Python, leur privateness est en fin de compte une question de convention, de ne pas la force.

98voto

Tony Meyer Points 4700

L'expression utilisée est "nous sommes tous des adultes consentants ici". En ajoutant un seul trait de soulignement (ne pas exposer) ou double trait de soulignement (cacher), vous racontez l'utilisateur de votre classe que vous souhaitez, le membre "privé" d'une certaine façon. Cependant, vous faites confiance à tout le monde de se comporter de façon responsable et le respect qu'à moins d'avoir une raison de ne pas l' (par exemple, des débogueurs, la complétion de code).

Si vous devez avoir quelque chose qui est privé, alors vous pouvez la mettre en œuvre dans une extension (par exemple en C pour Disponible). Dans la plupart des cas, cependant, vous simplement apprendre le Pythonic façon de faire les choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X