__all__ 是干嘛用的?

前言

前两天写代码的时候在一个简单的导入操作上竟然卡了有半小时之多,弄了半天才发现问题所在,分享给大家,希望对大家有所借鉴。

from 模块 import *

我们导入模块通常用 from 模块名 import * , 之前我一直认为,就是导入这个模块内的所有属性和方法,但事实并非如此,python 通过 __all__内置变量来决定 哪些属性和方法可供外部使用,我们具体来看例子:

我们首先创建个 了 text1.py 文件 ,内容如下:

# 测试变量param1 = "param1"param2 = "param2"# 测试函数def test1():    print("method test1() has been used")def test2():    print("method test2() has been used")# 测试类, 这里重新定义了魔法方法__call__,使得对象实例也可以像方法一样被调用class Test1():    def __call__(self):        print("class Test1() has been used!")class Test2():    def __call__(self):        print("class Test2() has been used!")__all__ = ['param1', 'test1', 'Test1']if __name__ == "__main__":    # 当前程序文件使用相关变量、方法、类    print(param1, param2)    test1()    test2()    T1 = Test1()    T1()    T2 = Test2()    T2()

我们可以看到 ,在test1.py模块文件内部,我们可以顺利的调用所有的测试变量,测试类,测试方法,另外,我们在模块文件内部定义了 __all__ = ['param1', 'test1', 'Test1'],这个有什么用呢,我们暂时看不出.

我们再新建个test2.py文件,内容如下:

from test1 import *try:    print(param1)except NameError as err:    print(err, ", no variable param1")try:    print(param2)except NameError as err:    print( "no variable param2")try:    test1()except NameError as err:    print(err, ", no method test1()")try:    test2()except NameError as err:    print("no method test2()")try:    T1 = Test1()    T1()except NameError as err:    print(err, ", no calss Test1()")try:    T2 = Test2()    T2()except NameError as err:    print("no class T2()")

执行结果如下:

param1no variable param2method test1() has been usedno method test2()class Test1() has been used!no class T2()

从执行结果可以看出,虽然我们在test2.py文件开头就用from test1 import * 导入了test1 模块中的所有变量和 函数方法,但从结果似乎不是如此,param2,test2(),和Test2都找不到,也就是没导入进来,而这几个变量或者方法恰恰是 在 test1.py 模块文件中的 __name__ 变量没有定义的, 所以,并不是 from 模块名 import *就导入 该模块的所有内容,而是一次导入模块中通过__all__变量指定的所有对象。所以,我们可以通过__all__变量 来决定哪些内容是否要提供给外部调用。

思考题 ,模块中 定义的私有变量(单下划线或双下划线) 是否也受 all 变量控制?


本文分享自微信公众号 - 软件测试架构师俱乐部(gh_03227f9a322f)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

微信关注我们

原文链接:https://my.oschina.net/u/4579654/blog/4500640

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。