前文有敘,Python是開放型社羣化的開發語言,因此咱們在編寫Python程序時,不可避免的須要用到別人已經作好的、成型的類庫,這些類庫多是圖形處理、多是網絡通信、多是數據分析等等,反正不須要本身來從新從最底層開始再寫一遍,這樣就須要用到import 來引入外來的拓展包。
可否找到更多的第三方庫、拓展包,也所以成爲評判一個編程語言的開發社區是否活躍、是否易用的一個標誌。因此,學會用好import就成爲咱們學習Python須要重點了解的第一個內容。
Python能經過import 引入的,有模塊(module)和包(package)兩種。
模塊(module)的做用,就是能夠把一組相關的功能,集成在一個 .py 文件中,方便在其它應用中經過 import 引入來調用。好比跟時間相關的操做,都集成在一個 module 中,使用時這樣來操做。編程
#引入time模塊 import time #調用time模塊的sleep()方法 time.sleep(1)
不一樣人寫的模塊(module)有可能會重名,例如A寫了個time.py模塊,B也寫了個time.py,他們中間各有一個方法很是好用,對於C來講,就容易混淆了。所以有了包(package)的概念。
包(package)是在module的外面加了一層,如網絡
#引入A的time模塊 import A.time #引入B的time模塊 import B.time #調用A的time模塊的sleep()方法 A.time.sleep(1) #調用B的time模塊的方法 B.time.setTime(0)
就至關於JAVA中的PACKAGE。物理上體如今:模塊(module)能夠放在同一目錄下,而包(package)通常放在以包名命名的文件夾中。下面以例子來解釋。編程語言
新建 lmModule.py,內容以下學習
print("From lmModule.py")
運行一下,能夠看到正常打印測試
From lmModule.py
在同一目錄中再新建一個main01.py,內容以下code
import lmModule print("From main01.py")
運行一下,能夠看到打印出來:開發
From lmModule.py From main01.py
因而可知,import其實是把要導入的程序預先加載在了主程序的前部,二者的內容都獲得了執行。數據分析
修改一下lmModule.py的內容,添加一個變量和一個方法:it
print("From lmModule.py") lmModule_var = "LmModule Var" def lmModule_method(): print("From lmModule.py lmModule_method")
再修改一下main01.py,來嘗試調用一下模塊的變量和方法:社區
import lmModule print("From main01.py") print(lmModule.lmModule_var) lmModule.lmModule_method()
運行發現,使用「模塊名+.」的方式,能夠很好的實現調用,運行結果以下:
From lmModule.py From main01.py LmModule Var From lmModule.py lmModule_method
再次修改main01.py,嘗試不一樣的import方法:
from lmModule import lmModule_var, lmModule_method print("From main01.py") print(lmModule_var) lmModule_method()
用「from 模塊名 import 部分變量或方法」這種方式,能夠從模塊中引入特定的的變量或方法,這些變量或方法能夠直接使用,就像程序本身定義的同樣,再不須要用「模塊名+.」來訪問。若是須要引入全部的變量或方法,能夠改寫成通配符*,執行效果同樣。
from lmModule import * print("From main01.py") print(lmModule_var) lmModule_method()
接下來,新建一個目錄dir,在dir下面新建一個「dirModule.py」,內容以下:
print("From dir dirModule")
修改main01.py,內容以下,以引入dir目錄下的dirModule模塊:
from lmModule import * from dir.dirModule import * print("From main01.py") print(lmModule_var) lmModule_method()
執行發現,把模塊定義在下級目錄中,也是能夠順利import到的,執行效果以下
From lmModule.py From dir dirModule From main01.py LmModule Var From lmModule.py lmModule_method
修改dirModule.py,在其中加入一個變量和一個方法的定義,內容以下:
print("From dir dirModule") lmModule_var = "DirModule Var" def lmModule_method(): print("From dir dirModule.py lmModule_method")
執行main01.py,能夠看到,當前後import的兩個模塊中,有相同的變量定義或方法定義時,前面先import的會被後import的覆蓋,執行效果以下:
From lmModule.py From dir dirModule From main01.py DirModule Var From dir dirModule.py lmModule_method
若是修改main01.py,交換import的順序,能夠看到,執行的結果不一樣,先import的會被後import的覆蓋,你能夠本身試試。
爲避免這種相互覆蓋而出錯的狀況,import 時仍是儘可能使用「模塊名+.」的方式來訪問,固然能夠用別名。修改main01.py以下:
import dir.dirModule as d import lmModule as h print("From main01.py") print(h.lmModule_var) d.lmModule_method()
執行效果以下:
From dir dirModule From lmModule.py From main01.py LmModule Var From dir dirModule.py lmModule_method
在dir目錄下新建一個「secModule.py"文件,內容以下:
print("From dir secModule") secModule_var = "SecModule Var"
修改main01.py,增長對於secModule模塊的調用,內容以下:
import dir.dirModule as d import dir.secModule import lmModule as h print("From main01.py") print(h.lmModule_var) d.lmModule_method() print(dir.secModule.secModule_var)
執行一下,能夠看到secModule模塊的內容正常被引入了,secModule模塊中定義的變量也可使用。
From dir dirModule From dir secModule From lmModule.py From main01.py LmModule Var From dir dirModule.py lmModule_method SecModule Var
好,那麼若是想一次性導入dir目錄下的多個文件,可行嗎,經測試 import dir.* 是很差使的;import dir 更是很差使。那怎麼辦呢?
該包(package)上場了!
在dir目錄下新建「__init__.py」,內容以下:
from . import secModule from . import dirModule
有了這個「__init__.py」,就把dir由一個目錄,變成了一個包(package)。Python只要在目錄下找到這個文件,就會按package來處理,下面咱們修改一下main01.py的內容:
import dir import lmModule as h print("From main01.py") print(h.lmModule_var) dir.dirModule.lmModule_method() print(dir.secModule.secModule_var)
執行一下,可見經過import一個包dir,能夠將包中的所在module都引入進來。執行效果以下:
From dir secModule From dir dirModule From lmModule.py From main01.py LmModule Var From dir dirModule.py lmModule_method SecModule Var
固然__init__.py中也能夠定義變量和方法。並且,若是「__init__.py」中包含了變量「__all__」,那麼將只有「__all__」中所指定的變量或方法能被外部訪問!「__all__」中所指定的變量或方法至關於JAVA中的public。