Python __all__变量用法

news/2024/11/15 3:15:02/

        事实上,当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线“_”或者双下划线“__”)开头的变量、函数和类。因此,如果我们不想模块文件中的某个成员被引入到其它文件中使用,可以在其名称前添加下划线。
        以前面章节中创建的 demo.py 模块文件和 test.py 文件为例(它们位于同一目录),各自包含的内容如下所示:

#demo.py
def say():print("人生苦短,我学Python!")def CLanguage():print("C语言中文网:http://c.biancheng.net")def disPython():print("Python教程:http://c.biancheng.net/python")#test.py
from demo import *
say()
CLanguage()
disPython()
​

执行 test.py 文件,输出结果为:

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

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

人生苦短,我学Python!
C语言中文网:http://c.biancheng.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("C语言中文网:http://c.biancheng.net")def disPython():print("Python教程:http://c.biancheng.net/python")__all__ = ["say","CLanguage"]

可见,__all__ 变量只包含 say() 和 CLanguage() 的函数名,不包含 disPython() 函数的名称。此时直接执行  test.py 文件,其执行结果为:

人生苦短,我学Python!
C语言中文网:http://c.biancheng.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("C语言中文网:http://c.biancheng.net")def disPython():print("Python教程:http://c.biancheng.net/python")__all__ = ["say"]#test.py
import demo
demo.say()
demo.CLanguage()
demo.disPython()

运行 test.py 文件,其输出结果为:

人生苦短,我学Python!
C语言中文网:http://c.biancheng.net
Python教程:http://c.biancheng.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 disPythonsay()
CLanguage()
disPython()

运行 test.py,输出结果为:

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

http://www.ppmy.cn/news/37351.html

相关文章

【python可视化】汇总中国的省市图,并且带经纬度边界

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1.安装basemap2.下载中国的省市.shp文件3. 代码前言 汇总中国的省市图&#xff0c;并且带经纬度边界&#xff0c;用的是mpl_toolkits工具库&#xff0c;pip 和c…

基于Spring Boot垃圾分类网站

文章目录 项目介绍主要功能截图:前台首页垃圾详情垃圾图谱个人中心后台用户管理垃圾分类管理员管理垃圾管理垃圾分类管理垃圾图谱管理部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都…

c++11 标准模板(STL)(std::unordered_multiset)(十一)

定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_multiset;(1)(C11 起)namespace pmr { …

--编写一个存储过程,输入一个日期,返回该日期与当下日期的时间差,如果该差是负的,则提示该日期已经过去XX天,不然提示距离该日期还有xx天

--创建存储过程&#xff0c;一个输入参数&#xff0c;一个输出参数 create or replace procedure sp_minus(i_date varchar2,o_minus out varchar2) is --声明一个变量&#xff0c;用来存放异常 v_errm varchar2(200); begin --判断输入格式 if length(i_date)<>8 th…

解读C++ constexpr关键字的特性

使用 constexpr 的最佳实践&#xff1a;优化性能和减少错误1. 引言a. C11中引入的constexpr关键字b. 编译时计算与运行时计算的区别c. constexpr的意义和优势2. constexpr基本语法a. constexpr变量i. 语法ii. 使用场景b. constexpr函数i. 语法ii. 使用场景c. constexpr条件表达…

C++/MFC工程[4]——绘制直线段

一、MoveTo()函数和LineTo()函数 本文实例均于 ***View().cpp文件中的OnDraw()函数中实现。 两函数在上上节C/MFC工程[2]——自定义平面直角坐标系中已经有所应用。 MoveTo()函数只设置起点&#xff0c;不画线。 LineTo()函数进行画线&#xff0c;画线结束后&#xff0c;起点变…

Vue表单双绑、组件

表单双绑、组件 1、什么是双向数据绑定 ​ Vue.js是一个MVVM框架&#xff0c;即数据双向绑定,即当数据发生变化的时候,视图也就发生变化&#xff0c;当视图发生变化的时候&#xff0c;数据也会跟着同步变化。这也算是Vue.js的精髓之处了。 ​ 值得注意的是&#xff0c;我们所…

Activiti7与Spring、Spring Boot整合开发

Activiti整合Spring 一、Activiti与Spring整合开发 1.1 Activiti与Spring整合的配置 1)、在pom.xml文件引入坐标 如下 <properties><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version> </properties> <d…