前言
前两天写代码的时候在一个简单的导入操做上居然卡了有半小时之多,弄了半天才发现问题所在,分享给你们,但愿对你们有所借鉴。python
from 模块 import *
咱们导入模块一般用 from 模块名 import *
, 以前我一直认为,就是导入这个模块内的全部属性和方法,但事实并不是如此,python 经过 __all__
内置变量来决定 哪些属性和方法可供外部使用,咱们具体来看例子:git
咱们首先建立个 了 text1.py
文件 ,内容以下:github
# 测试变量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']
,这个有什么用呢,咱们暂时看不出.web
咱们再新建个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__
变量 来决定哪些内容是否要提供给外部调用。app
思考题 ,模块中 定义的私有变量(单下划线或双下划线) 是否也受 all 变量控制?函数
本文分享自微信公众号 - 软件测试架构师俱乐部(gh_03227f9a322f)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。测试