模塊就是一個包含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