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/
  • 相关阅读:
    JS实现表格隔行换色,鼠标经过换色,单击换色,再单击还原等功能
    URL带有其他参数时,如何使用PHP的CI框架分页类?
    linux SVN web 同步
    php播放器代码
    php 获取IP 根据IP 获取城市信息 判断是否手机登陆
    微信公众平台获取微信用户信息
    appcan 本地真机调试
    对于探索搜索网站路上的一些迷茫
    成为全栈工程师真的好吗?
    ServletContext与ServletConfig
  • 原文地址:https://www.cnblogs.com/poloyy/p/15395672.html
Copyright © 2011-2022 走看看