Potrebbe esserci confusione tra privati di classe e privati di modulo .
Un modulo privato inizia con un carattere di sottolineatura
Tale elemento non viene copiato quando si utilizza il from <module_name> import *
modulo del comando import; viene comunque importato se si utilizza la import <moudule_name>
sintassi ( vedere la risposta di Ben Wilhelm )
Basta rimuovere un carattere di sottolineatura dal numero a .__ dell'esempio della domanda e non verrà mostrato nei moduli che importano a.py usando la from a import *
sintassi.
Un privato di classe inizia con due caratteri di sottolineatura (ovvero dunder o doppio punteggio inferiore).
Tale variabile ha il suo nome "alterato" per includere il nome
della classe ecc. È ancora possibile accedervi al di fuori della logica della classe, tramite il nome modificato.
Sebbene la manipolazione dei nomi possa servire come un lieve dispositivo di prevenzione contro l'accesso non autorizzato, il suo scopo principale è prevenire possibili collisioni di nomi con membri della classe delle classi antenate. Vedi il riferimento divertente ma accurato di Alex Martelli agli adulti consenzienti mentre descrive la convenzione usata riguardo a queste variabili.
>>> 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 () è un'istanza di classe. Che dà questa eccezione quando si usa il doppio trattino basso. Mentre nel tuo caso non hai creato una classe, hai semplicemente creato un modulo. Vedi anche: stackoverflow.com/questions/70528/…