Il peut y avoir confusion entre la classe des soldats et module de soldats.
Un module privé commence avec un seul trait de soulignement
Un tel élément n'est pas copié lors de l'utilisation de l'importation.
Il suffit de retirer un trait de soulignement de l'un.__num de la question de l'exemple et de ne pas s'afficher dans des modules que l'importation d'un.py.
Une classe privée commence avec deux caractères de soulignement (aka dsous soit le double de la sous-score)
Une telle variable a son nom de "déformation" de manière à inclure le nom de la classe etc.
Il peut encore être accessibles de l'extérieur de la logique de classe, par le biais de la déformation d'un nom.
Bien que le nom de déformation peut servir comme un doux dispositif de prévention contre les accès non autorisés, son but principal est d'éviter d'éventuelles collisions de nom avec les membres de la classe de l'ancêtre des classes.
Voir Alex Martelli est drôle, mais précis référence à des adultes consentants comme il le décrit de la convention en ce qui concerne ces variables.
>>> class Foo(object):
... __bar = 99
... def PrintBar(self):
... print(self.__bar)
...
>>> myFoo = Foo()
>>> myFoo.__bar #direct attempt no go
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute '__bar'
>>> myFoo.PrintBar() # the class itself of course can access it
99
>>> dir(Foo) # yet can see it
['PrintBar', '_Foo__bar', '__class__', '__delattr__', '__dict__', '__doc__', '__
format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__
', '__subclasshook__', '__weakref__']
>>> myFoo._Foo__bar #and get to it by its mangled name ! (but I shouldn't!!!)
99
>>>