Python __all__变量用法
以前面章节中创建的 demo.py 模块文件和 test.py 文件为例(它们位于同一目录),各自包含的内容如下所示:
def say(): print("人生苦短,我学Python!") def PLanguage(): print("青牛Python教程":https://www.cnblogs.com/qingchengzi/p/18055134") def disPython(): print("青牛django":https://www.cnblogs.com/qingchengzi/p/18054793") #test.py from demo import * say() PLanguage() disPython()
执行 test.py 文件,输出结果为:
人生苦短,我学Python! 青牛Python教程:https://www.cnblogs.com/qingchengzi/p/18055134 青牛django:https://www.cnblogs.com/qingchengzi/p/18054793
在此基础上,如果 demo.py 模块中的 disPython() 函数不想让其它文件引入,则只需将其名称改为 _disPython() 或者 __disPython()。修改之后,再次执行 test.py,其输出结果为:
def __disPython(): print("青牛django":https://www.cnblogs.com/qingchengzi/p/18054793")
执行test.py
... disPython() NameError: name 'disPython' is not defined
显然,test.py 文件中无法使用未引入的 disPython() 函数。
Python模块__all__变量
除此之外,还可以借助模块提供的 __all__ 变量,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称。通过在模块文件中设置 __all__ 变量,当其它文件以 from 模块名 import * 的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的成员。
也就是说,只有以“from 模块名 import *”形式导入的模块,当该模块设有 __all__ 变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。
demo.py模块文件
def say(): print("人生苦短,我学Python!") def PLanguage(): print("青牛Python教程":https://www.cnblogs.com/qingchengzi/p/18055134") def disPython(): print("青牛django":https://www.cnblogs.com/qingchengzi/p/18054793") __all__ ["say","PLanguage"]
可见,__all__ 变量只包含 say() 和 PLanguage() 的函数名,不包含 disPython() 函数的名称。此时直接执行 test.py 文件,其执行结果为:
... disPython() NameError: name 'disPython' is not defined
再次声明,__all__ 变量仅限于在其它文件中以“from 模块名 import *”的方式引入。也就是说,如果使用以下 2 种方式引入模块,则 __all__ 变量的设置是无效的。
1) 以import 模块名”的形式导入模块。通过该方式导入模块后,总可以通过模块名前缀(如果为模块指定了别名,则可以使用模快的别名作为前缀)来调用模块内的所有成员(除了以下划线开头命名的成员)。
仍以 demo.py 模块文件和 test.py 文件为例,修改它们的代码如下所示:
def say(): print("人生苦短,我学Python!") def PLanguage(): print("青牛Python教程":https://www.cnblogs.com/qingchengzi/p/18055134") def disPython(): print("青牛django":https://www.cnblogs.com/qingchengzi/p/18054793") #test.py import demo say() PLanguage() disPython()
运行 test.py 文件,其输出结果为:
人生苦短,我学Python! 青牛Python教程:https://www.cnblogs.com/qingchengzi/p/18055134 青牛django:https://www.cnblogs.com/qingchengzi/p/18054793
可以看到,虽然 demo.py 模块文件中设置有 __all__ 变量,但是当以import demo的方式引入后,__all__ 变量将不起作用。
2) 以from 模块名 import 成员的形式直接导入指定成员。使用此方式导入的模块,__all__ 变量即便设置,也形同虚设。
仍以 demo.py 和 test.py 为例,修改 test.py 文件中的代码,如下所示:
from demo import say from demo import CLanguage from demo import disPython say() PLanguage() disPython()
运行 test.py,输出结果为:
人生苦短,我学Python! 青牛Python教程:https://www.cnblogs.com/qingchengzi/p/18055134 青牛django:https://www.cnblogs.com/qingchengzi/p/18054793
浙公网安备 33010602011771号