摘要:所以,學會用好就成為我們學習需要重點了解的第一個內容。模塊的作用,就是可以把一組相關的功能,集成在一個文件中,方便在其它應用中通過引入來調用。為避免這種相互覆蓋而出錯的情況,時還是盡量使用模塊名的方式來訪問,當然可以用別名。
前文有敘,Python是開放型社群化的開發(fā)語言,所以我們在編寫Python程序時,不可避免的需要用到別人已經(jīng)做好的、成型的類庫,這些類庫可能是圖形處理、可能是網(wǎng)絡通訊、可能是數(shù)據(jù)分析等等,反正不需要自己來重新從最底層開始再寫一遍,這樣就需要用到import 來引入外來的拓展包。
能否找到更多的第三方庫、拓展包,也因此成為評判一個編程語言的開發(fā)社區(qū)是否活躍、是否易用的一個標志。所以,學會用好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。物理上體現(xiàn)在:模塊(module)可以放在同一目錄下,而包(package)一般放在以包名命名的文件夾中。下面以例子來解釋。
新建 lmModule.py,內容如下
print("From lmModule.py")
運行一下,可以看到正常打印
From lmModule.py
在同一目錄中再新建一個main01.py,內容如下
import lmModule print("From main01.py")
運行一下,可以看到打印出來:
From lmModule.py From main01.py
由此可見,import實際上是把要導入的程序預先加載在了主程序的前部,兩者的內容都得到了執(zhí)行。
修改一下lmModule.py的內容,添加一個變量和一個方法:
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()
運行發(fā)現(xiàn),使用“模塊名+.”的方式,可以很好的實現(xiàn)調用,運行結果如下:
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 部分變量或方法”這種方式,可以從模塊中引入特定的的變量或方法,這些變量或方法可以直接使用,就像程序自己定義的一樣,再不需要用“模塊名+.”來訪問。如果需要引入所有的變量或方法,可以改寫成通配符*,執(zhí)行效果一樣。
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()
執(zhí)行發(fā)現(xiàn),把模塊定義在下級目錄中,也是可以順利import到的,執(zhí)行效果如下
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")
執(zhí)行main01.py,可以看到,當先后import的兩個模塊中,有相同的變量定義或方法定義時,前面先import的會被后import的覆蓋,執(zhí)行效果如下:
From lmModule.py From dir dirModule From main01.py DirModule Var From dir dirModule.py lmModule_method
如果修改main01.py,交換import的順序,可以看到,執(zhí)行的結果不同,先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()
執(zhí)行效果如下:
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)
執(zhí)行一下,可以看到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目錄下的多個文件,可行嗎,經(jīng)測試 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)
執(zhí)行一下,可見通過import一個包dir,可以將包中的所在module都引入進來。執(zhí)行效果如下:
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。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/42943.html