Il peut y avoir confusion entre les classes privées et les modules privés .
Un module privé commence par un trait de soulignement
Un tel élément n'est pas copié lors de l'utilisation du from <module_name> import *
formulaire de la commande d'importation; il est cependant importé si vous utilisez la import <moudule_name>
syntaxe ( voir la réponse de Ben Wilhelm )
Supprimez simplement un trait de soulignement du numéro a .__ de l'exemple de la question et il ne s'affichera pas dans les modules qui importent a.py en utilisant la from a import *
syntaxe.
Une classe privée commence par deux traits de soulignement (alias dunder ie d-ouble under-score)
Une telle variable a son nom "mangled" pour inclure le nom de classe etc.
Elle peut toujours être consultée en dehors de la logique de la classe, via le nom mangled.
Bien que le changement de nom puisse servir de moyen de prévention léger contre les accès non autorisés, son objectif principal est d'empêcher d'éventuelles collisions de noms avec les membres de la classe des classes ancêtres. Voir la référence amusante mais précise d'Alex Martelli aux adultes consentants alors qu'il décrit la convention utilisée 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
>>>
>>> import fileinfo >>> m = fileinfo.MP3FileInfo() >>> m.__parse("/music/_singles/kairo.mp3") 1 Traceback (innermost last): File "<interactive input>", line 1, in ? AttributeError: 'MP3FileInfo' instance has no attribute '__parse'
fileinfo.MP3FileInfo () est une instance de classe. Ce qui donne cette exception lorsque vous utilisez un double soulignement. Alors que dans votre cas, vous n'avez pas créé de classe, vous venez de créer un module. Voir aussi: stackoverflow.com/questions/70528/…