Python易學就會(二)import的用法

  前文有敘,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。

相關文章
相關標籤/搜索