Pomiędzy szeregowymi szeregowymi a prywatnymi modułowymi może być zamieszanie .
A Moduł prywatne zaczyna się od jednego podkreślenia
taki element nie zostanie skopiowany razem podczas korzystania z from <module_name> import *
formularza polecenia importu; jest jednak importowany, jeśli używa się import <moudule_name>
składni ( patrz odpowiedź Bena Wilhelma )
Po prostu usuń jeden znak podkreślenia z a .__ przykładu pytania i nie będzie on wyświetlany w modułach, które importują a.py przy użyciu from a import *
składni.
A klasa prywatne rozpoczyna się dwoma podkreśleniami (aka Dunder czyli d-ouble pod-score)
Taka zmienna ma nazwę „zniekształcone” zawierać nazwę klasy itd.
To może nadal być dostępne poza logiką klasowej, poprzez zniekształconej nazwy.
Chociaż zmiana nazwy może służyć jako łagodne urządzenie zapobiegające nieautoryzowanemu dostępowi, jej głównym celem jest zapobieganie możliwym kolizjom nazw z członkami klas klas przodków. Zobacz zabawne, ale dokładne odniesienie Alexa Martellego do wyrażających zgodę dorosłych, gdy opisuje konwencję stosowaną w odniesieniu do tych zmiennych.
>>> 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 () jest instancją klasy. Co daje ten wyjątek, gdy używasz podwójnego podkreślenia. Podczas gdy w twoim przypadku nie stworzyłeś klasy, po prostu stworzyłeś moduł. Zobacz także: stackoverflow.com/questions/70528/…