模块就是一个包含python定义和声明的文件,文件名就是模块的名字加上.py后缀。换句话说,全部的py文件均可以当作是一个模块。python
模块名有两个:py文件名, __main__dom
使用globals()查看模块的名称空间测试
import random print(globals()) 结果: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000275FF8DC2B0>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python_我的/day 024 模块的语法/临时/临时.py',
'__cached__': None, 'random': <module 'random' from 'C:\\Python36\\lib\\random.py'>}
模块在导入的时候会建立其本身的名称空间。因此,在使用模块中的变量的时候通常是不会产生冲突的ui
test模块: main_person_one = "Jhon" def foo(): print(main_person_one)
# 调用方 import test main_person_one = "Tom" test.foo() # Jhon print(main_person_one) # Tom
在模块中使用globalspa
# 模块test中 main_person_one = "Jhon" def foo(): global main_person_one main_person_one = "Tom" print(main_person_one)
# 调用方 import test main_person_one = "Linda" test.foo() # Tom print(test.main_person_one) # Tom print(main_person_one) # Linda
使用from xxx import xxx 时,与import方式同样,python也会给模块建立名称空间。但不一样的是,import会把整个模块内容引入过来,而from方式则是部分引入。当一个模块中的内容过多时,能够采用此方式选择性的导入要使用的内容code
当从一个模块中引入一个变量时,若是当前文件中出现了重名的变量时,会覆盖掉模块引入的那个变量blog
# test模块: main_person_one = "Jhon" def foo(): print(main_person_one)
# 调用方 from test import main_person_one, foo main_person_one = "Tom" foo() # Jhon print(main_person_one) # Tom
# test模块: main_person_one = "Jhon" def foo(): print(main_person_one)
# 调用方 import test test.main_person_one = "Tom" print(test.main_person_one) # Tom
每一个模块在完成代码编写后,都需对其功能进行测试,此时须要对其编写测试代码。但被调用方导入时不需执行测试代码。此时能够利用__name__过滤掉测试代码的执行内存
在python中,每一个模块都有本身的__name__,但__name__的值是不定的。当把一个模块做为程序的入口时,此时该模块的__name__是"__main__",而若是把模块导入时,此时模块内部的__name__就是该模块自身的名字io
运行test模块时:编译
# test模块: def foo(): print('----test----') print(__name__) # __main__ if __name__ == '__main__': foo() # ----test----
运行调用方时:
# 调用方 import test
结果:
test # 即 test模块中,__name__ = test
在模块中设置__all__, 能够限制模块可容许的导入内容,只对from xxx import * 有效
# test模块 __all__ = ["x", "y"] x = 2 y = 3 z = 5 def test(): print("-----test-----")
# 调用方 from test import * print(x) # 2 print(z) # NameError: name 'z' is not defined