Es kann zu Verwechslungen zwischen Klassenprivaten und Modulprivaten kommen .
Ein privates Modul beginnt mit einem Unterstrich.
Ein solches Element wird bei Verwendung der from <module_name> import *
Form des Importbefehls nicht mitkopiert . Es wird jedoch importiert, wenn die import <moudule_name>
Syntax verwendet wird ( siehe Antwort von Ben Wilhelm ).
Entfernen Sie einfach einen Unterstrich aus der a .__ Nummer des Beispiels der Frage, und es wird nicht in Modulen angezeigt, die a.py mithilfe der from a import *
Syntax importieren .
Eine private Klasse beginnt mit zwei Unterstrichen (auch bekannt als dunder ie d-ouble underscore). Bei einer
solchen Variablen wird der Name "entstellt", um den Klassennamen usw. einzuschließen. Auf
sie kann auch außerhalb der Klassenlogik über den verstümmelten Namen zugegriffen werden.
Obwohl die Namensverknüpfung als milde Verhinderungsmaßnahme gegen unbefugten Zugriff dienen kann, besteht ihr Hauptzweck darin, mögliche Namenskollisionen mit Klassenmitgliedern der Ahnenklassen zu verhindern. Siehe Alex Martellis lustigen, aber genauen Hinweis auf einwilligende Erwachsene, während er die Konvention beschreibt, die in Bezug auf diese Variablen verwendet wird.
>>> 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 () ist eine Instanz der Klasse. Dies gibt diese Ausnahme, wenn Sie einen doppelten Unterstrich verwenden. Während Sie in Ihrem Fall keine Klasse erstellt haben, haben Sie nur ein Modul erstellt. Siehe auch: stackoverflow.com/questions/70528/…