Python __all__变量用法示例详解
作者:小刘学安卓 发布时间:2023-05-13 01:40:11
事实上,当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线“_”或者双下划线“__”)开头的变量、函数和类。因此,如果我们不想模块文件中的某个成员被引入到其它文件中使用,可以在其名称前添加下划线。
以前面章节中创建的 demo.py 模块文件和 test.py 文件为例(它们位于同一目录),各自包含的内容如下所示:
#demo.py
def say():
print("人生苦短,我学Python!")
def CLanguage():
print("脚本之家://www.jb51.net")
def disPython():
print("Python教程://www.jb51.net/python")
#test.py
from demo import *
say()
CLanguage()
disPython()
执行 test.py 文件,输出结果为:
人生苦短,我学Python!
脚本之家://www.jb51.net
Python教程://www.jb51.net/python
在此基础上,如果 demo.py 模块中的 disPython() 函数不想让其它文件引入,则只需将其名称改为 _disPython() 或者 __disPython()。修改之后,再次执行 test.py,其输出结果为:
人生苦短,我学Python!
脚本之家://www.jb51.net
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 文件中无法使用未引入的 disPython() 函数。
Python模块__all__变量
除此之外,还可以借助模块提供的 __all__ 变量,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称。通过在模块文件中设置 __all__ 变量,当其它文件以“from 模块名 import *”的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的成员。
也就是说,只有以“from 模块名 import *”形式导入的模块,当该模块设有 __all__ 变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。
举个例子,修改 demo.py 模块文件中的代码:
def say():
print("人生苦短,我学Python!")
def CLanguage():
print("脚本之家://www.jb51.net")
def disPython():
print("Python教程://www.jb51.net/python")
__all__ = ["say","CLanguage"]
可见,__all__ 变量只包含 say() 和 CLanguage() 的函数名,不包含 disPython() 函数的名称。此时直接执行 test.py 文件,其执行结果为:
人生苦短,我学Python!
脚本之家://www.jb51.net
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__ 变量的设置是无效的。
1. 以“import 模块名”的形式导入模块。通过该方式导入模块后,总可以通过模块名前缀(如果为模块指定了别名,则可以使用模快的别名作为前缀)来调用模块内的所有成员(除了以下划线开头命名的成员)。
仍以 demo.py 模块文件和 test.py 文件为例,修改它们的代码如下所示:
#demo.py
def say():
print("人生苦短,我学Python!")
def CLanguage():
print("脚本之家://www.jb51.net")
def disPython():
print("Python教程://www.jb51.net/python")
__all__ = ["say"]
#test.py
import demo
demo.say()
demo.CLanguage()
demo.disPython()
运行 test.py 文件,其输出结果为:
人生苦短,我学Python!
C语言中文网://www.jb51.net
Python教程://www.jb51.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!
脚本之家://www.jb51.net
Python教程://www.jb51.net/python
来源:https://blog.csdn.net/liuqinhou/article/details/129785055
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 问题有二进制文件中保存了 20 亿个 2 Bytes 的数,需将其读出,每 20000 个数作图,拟合后输出结果。解决# -*- codin
- Silverlight和Flash,到底谁更强?谁更有优势?很多初接触Silverlight和Flash的人总是会问这个问题,因为它们在表面
- 前言web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展。然而,正所谓成也萧何败也萧何,开放的特性、搜索引
- 可控制的滚动新闻不同于自动的滚动条,它是通过按钮控制移动的,当你把鼠标放在按钮上时,新闻内容就会向上或
- 最近在查看asp之家的访客统计时,发现访客使用firefox浏览器的占了10%-15%,而大部分的访客使用的是IE6,呵呵我也是用IE6。而
- DBA_2PC_PENDING Oracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚。一般情况下,处理过程在很短
- 效果图:css:<style type="text/css"> /* 带复选框的下拉框 */ ul li{
- 目的现有两幅栅格图像,一个是某地区道路栅格图,一个是某地区土地利用类型图,需要将道路叠加到土地利用类型图中,即叠加后,重合的像元值以道路图为
- 目录一. 加载数据1. 继承Dataset类并重写关键方法2. 使用Dataloader加载数据二. 模型设计三. 训练四. 测试结语pyt
- 前言Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的。包内导入即是包内的模块导入包内部的模块。Python import
- 我希望大家看到该标题就能让想象到它的功能: 1、WITH TEMPL
- 问题: 1.购物车中的数据是否应该存储在数据库中? 我特别想知道在真正的项目中,那些真正的软件工程师是如何考虑这个问题的。在Google上一
- 在设计网页时,经常遇到某些页面需限权访问的情况。比如,一个公司的某些产品只让某一或某些供应商或客户浏览。那么,我们如何实现这一功能呢?本文,
- 本文主要给大家介绍了关于webpack中publicPath路径问题的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:output:
- 前言你可能不需要经常处理分数,但当你需要时,Python的Fraction类会给你很大的帮助。本文将给大家详细介绍关于利用标准库fracti
- win2000注册表程序 regedt32.exe下面是解决IIS出现Active Server Pages错误&
- 概述基于Swoole的websocket服务,计划整合3篇进行技术整理,该服务主要有2个核心业务,用户消息服务(消息计数统计)和 客服IM消
- Firefox 的 Jetpack 可以让我们很轻松地创建 Firefox 插件,仅通过已掌握的前端技能(HTML/CSS/JS),估计让人
- 要使数据库具备更强的抵御侵犯的能力,你要采取几步措施。有些措施只是良好的服务器管理的一部分,如拥有SQL Server最新的补丁,其他则包括
- 在cssrain整理的一个 试题集 中有这么一道题:<SCRIPT LANGUAGE="JavaScript"&g