Python中的名字隐藏
Python对于module文件中的name是没有private和public区分的,严格来说,在module文件重定义的任何name,都可以被外界访问。但是,对于 from module imort * 语法,Python提供了隐藏name的方法。
_X命名
如果module文件中的name使用单下划线做前缀命名,那么,from module import *语法无法导入这些name。假设有如下Python module文件, test.py:
_a = 9 __b = 99 # 双下划线开头 c = 999 d = 9999
那么,使用 from test import * 语句,导入不了_a,__b,但是可以访问c和d:
>>>from test import * >>>_a NameError: name '_a' is not defined >>>__b NameError: name '__b' is not defined >>>c 999 >>>d 9999
__all__
另一种隐藏name的方式是在module文件中将想让导出的变量放到__all__数组里面,仍然假设是test.py文件:
__all__ = ['_a', 'c'] _a = 9 __b = 99 c = 999 d = 9999
那么,使用 from test import * 语句,只能导入_a,c,无法导入__b和d:
>>>from test import * >>>_a 9 >>>__b NameError: name '__b' is not defined >>>c 999 >>>d NameError: name 'd' is not defined
需要注意的是,无论是_X命名法,还是__all__数组,它们能够隐藏name的前提是使用 from moudle import *语法,如果不是使用的该语法,那么,_X和__all__隐藏不了任何name,所有的name都可以被访问。