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都可以被访问。

原文地址:https://www.cnblogs.com/chaoguo1234/p/9350820.html