Single Underscore
Les noms, dans une classe, avec un trait de soulignement en tête servent simplement à indiquer aux autres programmeurs que l'attribut ou la méthode est destiné à être privé. Cependant, rien de spécial n'est fait avec le nom lui-même.
Je cite PEP-8 :
_single_leading_underscore : indicateur faible "d'usage interne". Par exemple from M import *
n'importe pas les objets dont le nom commence par un trait de soulignement.
Double Underscore (confusion de noms)
Desde la documentation Python :
Tout identifiant de la forme __spam
(au moins deux traits de soulignement en tête, au plus un trait de soulignement en queue) est remplacé textuellement par _classname__spam
, donde classname
est le nom de la classe actuelle, sans le(s) trait(s) de soulignement en tête. Ce traitement est effectué sans tenir compte de la position syntaxique de l'identifiant, il peut donc être utilisé pour définir des variables d'instance et de classe class-private, des méthodes, des variables stockées dans des globales, et même des variables stockées dans des instances. private à cette classe sur des instances d'autres classes.
Et un avertissement de la même page :
La gestion des noms est destinée à donner aux classes un moyen facile de définir des variables d'instance et des méthodes "privées", sans avoir à se soucier des variables d'instance définies par des classes dérivées, ou de l'utilisation des variables d'instance par du code extérieur à la classe. Notez que les règles de mangement sont conçues principalement pour éviter les accidents ; il est toujours possible pour une âme déterminée d'accéder ou de modifier une variable qui est considérée comme privée.
Exemple
>>> class MyClass():
... def __init__(self):
... self.__superprivate = "Hello"
... self._semiprivate = ", world!"
...
>>> mc = MyClass()
>>> print mc.__superprivate
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: myClass instance has no attribute '__superprivate'
>>> print mc._semiprivate
, world!
>>> print mc.__dict__
{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}
3 votes
Une excellente réponse courte provenant d'un autre fil de discussion : stackoverflow.com/a/8689983/911945
0 votes
Voir aussi excellent qui traite de la différence entre le soulignement simple et le soulignement double, et qui démontre la "confusion des noms" : Réponse à "Private members in Python" (en anglais)