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__ 变量,当其它文件以&ldquo;from 模块名 import *&rdquo;的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的成员

也就是说,只有以&ldquo;from 模块名 import *&rdquo;形式导入的模块,当该模块设有 __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__ 变量仅限于在其它文件中以&ldquo;from 模块名 import *&rdquo;的方式引入。也就是说,如果使用以下 2 种方式引入模块,则 __all__ 变量的设置是无效的。

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

仍以 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__ 变量,但是当以&ldquo;import demo&rdquo;的方式引入后,__all__ 变量将不起作用。

2.  以&ldquo;from 模块名 import 成员&rdquo;的形式直接导入指定成员。使用此方式导入的模块,__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

标签:Python,all,变量
0
投稿

猜你喜欢

  • 在SQL触发器或存储过程中获取在程序登录的用户

    2012-01-29 18:01:32
  • python matplotlib工具栏源码探析二之添加、删除内置工具项的案例

    2022-05-16 19:31:22
  • Flask模拟实现CSRF攻击的方法

    2023-11-18 16:21:39
  • python生成不重复随机数和对list乱序的解决方法

    2023-09-24 01:17:59
  • Sql server2005 优化查询速度50个方法小结

    2024-01-26 16:51:52
  • Python 面向对象之封装、继承、多态操作实例分析

    2021-04-09 10:03:54
  • Python读取和存储yaml文件的方法

    2023-03-26 10:23:44
  • python使用正则表达式分析网页中的图片并进行替换的方法

    2022-04-12 02:32:40
  • Golang信号处理及如何实现进程的优雅退出详解

    2024-05-28 15:24:29
  • 关于Python中*args和**kwargs的深入理解

    2021-04-07 17:45:06
  • Python Django搭建文件下载服务器的实现

    2021-06-04 14:37:55
  • python类的方法属性与方法属性的动态绑定代码详解

    2023-07-02 03:31:26
  • 利用PyCharm Profile分析异步爬虫效率详解

    2023-08-15 03:02:58
  • 基于多进程中APScheduler重复运行的解决方法

    2021-12-18 05:10:11
  • pandas pd.cut()与pd.qcut()的具体实现

    2022-08-03 03:41:36
  • pandas 根据列的值选取所有行的示例

    2023-10-13 16:19:38
  • Python中变量的输入输出实例代码详解

    2022-11-26 00:47:56
  • SQLServer 清理日志的实现

    2024-01-27 12:41:21
  • python实现的简单FTP上传下载文件实例

    2022-12-29 13:17:42
  • Python中staticmethod和classmethod的作用与区别

    2022-03-12 21:30:00
  • asp之家 网络编程 m.aspxhome.com