类 privates和模块 privates之间可能存在混淆。
一个私有的模块以一个下划线开头
这样一个元素在使用from <module_name> import *
import 命令的形式时不会被复制;但是,如果使用import <moudule_name>
语法(请参阅 Ben Wilhelm 的回答) ,它会被导入
,只需从问题示例的 a.__num 中删除一个下划线,它就不会显示在使用from a import *
语法导入 a.py 的模块中。
私有类以两个下划线开头 (又名 dunder 即 d-ouble 下划线)
这样的变量的名称“错位”以包含类名等。
它仍然可以通过错位名称在类逻辑之外访问。
尽管名称修改可以作为一种温和的预防装置来防止未经授权的访问,但其主要目的是防止与祖先类的类成员可能发生的名称冲突。请参阅 Alex Martelli 对同意的成年人的有趣但准确的参考,因为他描述了关于这些变量使用的约定。
>>> 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
>>>