クラスprivatesとモジュールprivatesの間に混乱があるかもしれません。
モジュールプライベートで始まるアンダー1
このようなAエレメントが使用時に沿ってコピーされていないfrom <module_name> import *
インポート・コマンドの形式を、ただし、import <moudule_name>
構文を使用する場合はインポートされます(Ben Wilhelmの回答を参照)
質問の例のa .__ numから1つのアンダースコアを削除するだけで、from a import *
構文を使用してa.pyをインポートするモジュールには表示されません。
クラスプライベートで始まる2つの下線 (別名dunderすなわちD-oubleアンダースコア)は、
このような変数は、クラス名などを含めるように「マングル」その名前を持っている
それはまだマングルされた名前を通じて、クラスロジックの外にアクセスすることができます。
名前マングリングは、不正アクセスに対する穏やかな防止デバイスとして機能しますが、その主な目的は、祖先クラスのクラスメンバーとの名前の衝突を防ぐことです。これらの変数に関して使用されている規則について説明しているアレックスマーテリの同意している大人への面白いが正確なリファレンスを参照してください。
>>> 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()はクラスのインスタンスです。ダブルアンダースコアを使用すると、この例外が発生します。あなたの場合では、クラスを作成しなかったのに対して、モジュールを作成しただけです。参照:stackoverflow.com/questions/70528/...