zoukankan      html  css  js  c++  java
  • Python __all__ 变量

    import *

    • 当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线 _ 或者双下划线 __ )开头的变量、函数和类
    • 因此,如果不想模块文件中的某个对象被引入到其它文件中使用,可以在其名称前添加下划线
    • 下面就来讲下 import * 的栗子

    demo.py

    def say():
        print("人生苦短,我学Python!")
    def disPython(): print("小菠萝教程:https://www.cnblogs.com/poloyy/")

      

    test.py

    from demo import *
    
    say()
    disPython()

     

    执行结果

    人生苦短,我学Python!
    小菠萝教程:https://www.cnblogs.com/poloyy/

    如果对象不想被引入呢

    如果 demo.py 模块中的 disPython() 函数不想让其它文件引入,则只需将其名称改为 _disPython() 或者 __disPython() 

    再次执行 test.py,输出结果

    人生苦短,我学Python!
    Traceback (most recent call last):
      File "C:/Users/polo/Desktop/2.py", line 4, in <module>
        disPython()
    NameError: name 'disPython' is not defined

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

    Python 模块 __all__ 变量

    • 模块提供的 __all__ 变量,该变量的值是一个列表,存储的是当前模块中一些对象成员(变量、函数或者类)的名称(字符串格式)
    • 通过在模块文件中设置 __all__ 变量,当其它文件以 from 模块名 import * 的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的对象成员,未指定的成员是无法导入的

    demo.py

    def say():
        print("人生苦短,我学Python!")
    
    def disPython():
        print("小菠萝教程:https://www.cnblogs.com/poloyy/") 

    __all__ = ["say"]

    __all__ 变量包含 say()的函数名,包含 disPython() 函数的名称

    test.py

    from demo import *
    
    say()
    disPython()

    运行 test.py

    人生苦短,我学Python!
    Traceback (most recent call last):
      File "C:/Users/mengma/Desktop/2.py", line 4, in <module>
        disPython()
    NameError: name 'disPython' is not defined
    • 对于 test.py 来说,demo.py 模块中的 disPython() 函数是未引入,这样调用是非法的
    • 重点:__all__ 变量仅限于在其它文件中以 from 模块名 import * 的方式引入

    使用以下 2 种方式引入模块,__all__ 变量是无效的

    方式一

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

    demo.py 

    def say():
        print("人生苦短,我学Python!")
    
    def disPython():
        print("小菠萝教程:https://www.cnblogs.com/poloyy/") 
    
    __all__ = ["say"]

    test.py

    import demo
    
    demo.say()
    demo.disPython()

    运行 test.py

    人生苦短,我学Python!
    小菠萝教程:https://www.cnblogs.com/poloyy/

    虽然 demo.py 模块中设置有  __all__ 变量,但是当以 import demo 的方式引入后,__all__ 变量将不起作用

    方式二

     from 模块名 import 对象成员 的形式直接导入指定成员,使用此方式导入的模块,__all__ 变量即便设置,也不起作用

    demo.py 

    仍然是上面的 demo 代码

    test.py

    from demo import say
    from demo import disPython
    
    say()
    disPython()

    运行 test.py

    人生苦短,我学Python!
    小菠萝教程:https://www.cnblogs.com/poloyy/
  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/poloyy/p/15395672.html
Copyright © 2011-2022 走看看