前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python - __all__ 变量

Python - __all__ 变量

作者头像
小菠萝测试笔记
发布2021-10-14 10:42:51
1.2K0
发布2021-10-14 10:42:51
举报

import *

  • 当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线 或者双下划线 __ )开头的变量、函数和类

_

  • 因此,如果不想模块文件中的某个对象被引入到其它文件中使用,可以在其名称前添加下划线
  • 下面就来讲下 import * 的栗子
demo.py
代码语言:javascript
复制
def say():
    print("人生苦短,我学Python!")

def disPython():
    print("小菠萝教程:https://www.cnblogs.com/poloyy/")
test.py
代码语言:javascript
复制
from demo import *

say()
disPython()
执行结果
代码语言:javascript
复制
人生苦短,我学Python!
小菠萝教程:https://www.cnblogs.com/poloyy/
如果对象不想被引入呢

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

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

代码语言:javascript
复制
人生苦短,我学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__ 变量,当其它文件以 的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的对象成员,未指定的成员是无法导入的

from 模块名 import *

demo.py
代码语言:javascript
复制
def say():
    print("人生苦短,我学Python!")

def disPython():
    print("小菠萝教程:https://www.cnblogs.com/poloyy/") 

__all__ = ["say"]

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

test.py
代码语言:javascript
复制
from demo import *

say()
disPython()
运行 test.py
代码语言:javascript
复制
人生苦短,我学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
代码语言:javascript
复制
def say():
    print("人生苦短,我学Python!")

def disPython():
    print("小菠萝教程:https://www.cnblogs.com/poloyy/") 

__all__ = ["say"]
test.py
代码语言:javascript
复制
import demo

demo.say()
demo.disPython()
运行 test.py
代码语言:javascript
复制
人生苦短,我学Python!
小菠萝教程:https://www.cnblogs.com/poloyy/

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

方式二

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

demo.py

仍然是上面的 demo 代码

test.py
代码语言:javascript
复制
from demo import say
from demo import disPython

say()
disPython()
运行 test.py
代码语言:javascript
复制
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • import *
    • demo.py
      • test.py
        • 执行结果
          • 如果对象不想被引入呢
          • Python 模块 __all__ 变量
            • demo.py
              • test.py
                • 运行 test.py
                  • 使用以下 2 种方式引入模块,__all__ 变量是无效的
                    • 方式一
                    • demo.py
                    • test.py
                    • 运行 test.py
                    • 方式二
                    • demo.py
                    • test.py
                    • 运行 test.py
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档