根据http://www.faqs.org/docs/diveintopython/fileinfo_private.html:
像大多数语言一样,Python具有
私有元素的概念:
私人
函数,这些函数不能被调用
在模块外
然而,如果我定义两个文件:
#a.py
__num=1
and:
#b.py
import a
print a.__num
当我运行b.py时,它输出1而不给出任何异常。是diveintopython错了,还是我误解了什么?是否有方法将模块的函数定义为私有?
这个问题没有得到完全的回答,因为模块私密性并不完全是常规的,而且使用import可能会识别模块私密性,也可能不会,这取决于它的使用方式。
如果你在一个模块中定义了私有名称,这些名称将被导入到任何使用'import module_name'语法的脚本中。因此,假设您在示例中正确定义了模块private, _num,在a.py中,如下所示..
#a.py
_num=1
..你可以在b.py中使用模块名符号来访问它:
#b.py
import a
...
foo = a._num # 1
要从a.py中只导入非私有对象,你必须使用from语法:
#b.py
from a import *
...
foo = _num # throws NameError: name '_num' is not defined
然而,为了清晰起见,在从模块中导入名称时最好显式,而不是用'*'导入它们:
#b.py
from a import name1
from a import name2
...
这个问题没有得到完全的回答,因为模块私密性并不完全是常规的,而且使用import可能会识别模块私密性,也可能不会,这取决于它的使用方式。
如果你在一个模块中定义了私有名称,这些名称将被导入到任何使用'import module_name'语法的脚本中。因此,假设您在示例中正确定义了模块private, _num,在a.py中,如下所示..
#a.py
_num=1
..你可以在b.py中使用模块名符号来访问它:
#b.py
import a
...
foo = a._num # 1
要从a.py中只导入非私有对象,你必须使用from语法:
#b.py
from a import *
...
foo = _num # throws NameError: name '_num' is not defined
然而,为了清晰起见,在从模块中导入名称时最好显式,而不是用'*'导入它们:
#b.py
from a import name1
from a import name2
...