• 来看看Python __all__变量的用法



    事实上,当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线“_”或者双下划线“__”)开头的变量、函数和类。因此,如果我们不想模块文件中的某个成员被引入到其它文件中使用,可以在其名称前添加下划线。

    以前面章节中创建的 demo.py 模块文件和 test.py 文件为例(它们位于同一目录),各自包含的内容如下所示:


    #demo.py
    def say():
    print("人生苦短,我学Python!")
    def CLanguage():
    print("C语言中文网:http://csdn.net")
    def disPython():
    print("Python教程:http://csdn.net/python")
    #test.py
    from demo import *
    say()
    CLanguage()
    disPython()
    执行 test.py 文件,输出结果为:

    人生苦短,我学Python!
    C语言中文网:http://csdn.net
    Python教程:http://csdn.net/python


    在此基础上,如果 demo.py 模块中的 disPython() 函数不想让其它文件引入,则只需将其名称改为 _disPython() 或者 __disPython()。修改之后,再次执行 test.py,其输出结果为:

    人生苦短,我学Python!
    C语言中文网:http://csdn.net
    Traceback (most recent call last):
      File "C:/Users/mengma/Desktop/2.py", line 4, in
        disPython()
    NameError: name 'disPython' is not defined

    显然,test.py 文件中无法使用未引入的 disPython() 函数。

    Python模块__all__变量
    除此之外,还可以借助模块提供的 __all__ 变量,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称。通过在模块文件中设置 __all__ 变量,当其它文件以“from 模块名 import *”的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的成员。


    举个例子,修改 demo.py 模块文件中的代码:


    def say():
    print("人生苦短,我学Python!")
    def CLanguage():
    print("C语言中文网:http://csdn.net")
    def disPython():
    print("Python教程:http://csdn.net/python")
    __all__ = ["say","CLanguage"]
    可见,__all__ 变量只包含 say() 和 CLanguage() 的函数名,不包含 disPython() 函数的名称。此时直接执行  test.py 文件,其执行结果为:

    人生苦短,我学Python!
    C语言中文网:http://csdn.net
    Traceback (most recent call last):
      File "C:/Users/mengma/Desktop/2.py", line 4, in
        disPython()
    NameError: name 'disPython' is not defined

    显然,对于 test.py 文件来说,demo.py 模块中的 disPython() 函数是未引入,这样调用是非法的。

    再次声明,__all__ 变量仅限于在其它文件中以“from 模块名 import *”的方式引入。也就是说,如果使用以下 2 种方式引入模块,则 __all__ 变量的设置是无效的。

    1) 以“import 模块名”的形式导入模块。通过该方式导入模块后,总可以通过模块名前缀(如果为模块指定了别名,则可以使用模快的别名作为前缀)来调用模块内的所有成员(除了以下划线开头命名的成员)。

    仍以 demo.py 模块文件和 test.py 文件为例,修改它们的代码如下所示:


    #demo.py
    def say():
    print("人生苦短,我学Python!")
    def CLanguage():
    print("C语言中文网:http://csdn.net")
    def disPython():
    print("Python教程:http://csdn.net/python")
    __all__ = ["say"]
    #test.py
    import demo
    demo.say()
    demo.CLanguage()
    demo.disPython()
    运行 test.py 文件,其输出结果为:

    人生苦短,我学Python!
    C语言中文网:http://csdn.net
    Python教程:http://csdn.net/python

    可以看到,虽然 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()
    CLanguage()
    disPython()
    运行 test.py,输出结果为:

    人生苦短,我学Python!
    C语言中文网:http://csdn.net
    Python教程:http://csdn.net/python

  • 相关阅读:
    Android Material Design之MaterialToolbar(三)
    Python实现Stacking回归模型(随机森林回归、极端随机树回归、AdaBoost回归、GBDT回归、决策树回归)项目实战
    工业4.0利器:MES系统
    创建一个GO模块
    [当前就业]2023年8月25日-计算机视觉就业现状分析
    sql题目练习
    关于nginx一个域名,配置多个端口https的方法
    反射_数据结构
    抖音短视频实操:矩阵号之为什么要做矩阵号和如何做矩阵号(下)
    JavaWeb学习——IDEA通过MyBatis搭建,Vue编写,axios交互的增删查改项目
  • 原文地址:https://blog.csdn.net/weixin_42673574/article/details/132905584